본문 바로가기

삽질

[WM] Image API 사진 회전 후 저장


하루종일 삽질 삽질을 거듭하여 샘플정도로 간단하게 만들어 봤습니다.

CComPtr m_pImgFactory;
CComPtr image;
m_pImgFactory->CreateImageFromFile(filename, &image);

CComQIPtr pBitmap;
CComPtr pBitmapOps;

// 불러온 Iimage로 IBitmapImage 생성
m_pImgFactory->CreateBitmapFromImage(image, 0, 0, PixelFormatDontCare, InterpolationHintNearestNeighbor, &pBitmap);
pBitmap->QueryInterface(IID_IBasicBitmapOps, (void**)&pBitmapOps);
pBitmap.Release();

// 이미지 90도 회전
pBitmapOps->Rotate(90, InterpolationHintNearestNeighbor, &pBitmap);
image.Release();
pBitmapOps.Release();

pBitmap->QueryInterface(IID_IImage, (void**)&image);
		
// 인코딩 코덱 찾기
ImageCodecInfo * codecinfo;
UINT count;
CLSID clsid;
m_pImgFactory->GetInstalledEncoders(&count, &codecinfo);

for(UINT i = 0; i < count ; i++) {
	// JPEG 코덱 찾기
	if(wcscmp(codecinfo[i].MimeType, _T("image/jpeg")) == 0) {
		clsid = codecinfo[i].Clsid;
				
		break;
	}
}
free(codecinfo);

// 인코딩할 파일 저장
CComPtr pEncoder;
m_pImgFactory->CreateImageEncoderToFile(&clsid, _T("파일명"), &pEncoder);

// 인코딩할 이미지 싱크 생성
CComPtr pImgSink;
pEncoder->GetEncodeSink(&pImgSink);
// 기존의 이미지를 이미지 싱크로 보냄
image->PushIntoSink(pImgSink); 
pImgSink.Release();
// 인코딩 종료
pEncoder->TerminateEncoder();
pEncoder.Release();

 

회전 한 파일이 파일명으로 바로 저장됩니다.