타이핑의 기억
IImagingFactory 를 이용한 이미지 사이즈 변경
unier
2009. 12. 11. 15:41
#define CONVERT_IMAGE_WIDTH 800
#define CONVERT_IMAGE_HEIGHT 480
#define CONVERT_IMAGE_PATH _T("이미지이름.jpg")
IImagingFactory *pImgFactory = NULL;
IImage *pImage = NULL;
IBitmapImage *pBitmap = NULL;
IBasicBitmapOps *pBitmapOps = NULL;
ImageCodecInfo *pCodecInfo = NULL;
CoInitializeEx(NULL, COINIT_MULTITHREADED);
if (SUCCEEDED(CoCreateInstance (CLSID_ImagingFactory,
NULL,
CLSCTX_INPROC_SERVER,
IID_IImagingFactory,
(void **)&pImgFactory)))
{
if (SUCCEEDED(pImgFactory->CreateImageFromFile(
tcsFullPath,
&pImage)))
{
pImgFactory->CreateBitmapFromImage(pImage, 0, 0, PixelFormatDontCare, InterpolationHintDefault, &pBitmap);
pBitmap->QueryInterface(IID_IBasicBitmapOps, (void**)&pBitmapOps);
pBitmap->Release();
pBitmapOps->Resize(CONVERT_IMAGE_WIDTH, CONVERT_IMAGE_HEIGHT, PixelFormatDontCare, InterpolationHintDefault, &pBitmap);
pBitmapOps->Release();
pImage->Release();
// find jpeg codec for encode
pBitmap->QueryInterface(IID_IImage, (void**)&pImage);
pBitmap->Release();
UINT uCount = 1;
CLSID clsid;
pImgFactory->GetInstalledEncoders(&uCount, &pCodecInfo);
for(UINT i = 0; i < uCount ; i++)
{
if(wcscmp(pCodecInfo[i].MimeType, _T("image/jpeg")) == 0) {
clsid = pCodecInfo[i].Clsid;
break;
}
}
free(pCodecInfo);
// save file for encode
IImageEncoder * pEncoder;
pImgFactory->CreateImageEncoderToFile(&clsid, CONVERT_IMAGE_PATH, &pEncoder);
// create image sink for encode
IImageSink * pImgSink;
pEncoder->GetEncodeSink(&pImgSink);
// send image sink
pImage->PushIntoSink(pImgSink);
pImgSink->Release();
// finish encode
pEncoder->TerminateEncoder();
pEncoder->Release();
pImage->Release();
bResult = TRUE;
}
pImgFactory->Release();
}
CoUninitialize();
#define CONVERT_IMAGE_HEIGHT 480
#define CONVERT_IMAGE_PATH _T("이미지이름.jpg")
IImagingFactory *pImgFactory = NULL;
IImage *pImage = NULL;
IBitmapImage *pBitmap = NULL;
IBasicBitmapOps *pBitmapOps = NULL;
ImageCodecInfo *pCodecInfo = NULL;
CoInitializeEx(NULL, COINIT_MULTITHREADED);
if (SUCCEEDED(CoCreateInstance (CLSID_ImagingFactory,
NULL,
CLSCTX_INPROC_SERVER,
IID_IImagingFactory,
(void **)&pImgFactory)))
{
if (SUCCEEDED(pImgFactory->CreateImageFromFile(
tcsFullPath,
&pImage)))
{
pImgFactory->CreateBitmapFromImage(pImage, 0, 0, PixelFormatDontCare, InterpolationHintDefault, &pBitmap);
pBitmap->QueryInterface(IID_IBasicBitmapOps, (void**)&pBitmapOps);
pBitmap->Release();
pBitmapOps->Resize(CONVERT_IMAGE_WIDTH, CONVERT_IMAGE_HEIGHT, PixelFormatDontCare, InterpolationHintDefault, &pBitmap);
pBitmapOps->Release();
pImage->Release();
// find jpeg codec for encode
pBitmap->QueryInterface(IID_IImage, (void**)&pImage);
pBitmap->Release();
UINT uCount = 1;
CLSID clsid;
pImgFactory->GetInstalledEncoders(&uCount, &pCodecInfo);
for(UINT i = 0; i < uCount ; i++)
{
if(wcscmp(pCodecInfo[i].MimeType, _T("image/jpeg")) == 0) {
clsid = pCodecInfo[i].Clsid;
break;
}
}
free(pCodecInfo);
// save file for encode
IImageEncoder * pEncoder;
pImgFactory->CreateImageEncoderToFile(&clsid, CONVERT_IMAGE_PATH, &pEncoder);
// create image sink for encode
IImageSink * pImgSink;
pEncoder->GetEncodeSink(&pImgSink);
// send image sink
pImage->PushIntoSink(pImgSink);
pImgSink->Release();
// finish encode
pEncoder->TerminateEncoder();
pEncoder->Release();
pImage->Release();
bResult = TRUE;
}
pImgFactory->Release();
}
CoUninitialize();