타이핑의 기억

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();