使用COM IImagingFactory相关的接口将BMP转化为JPG
我需要将BMP转化为JPG,现在在使用COM接口,但是遇到了一个问题。
BMP图像是存在Buf中的,也就是只有像素值的数据,
程序如下:
HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
ASSERT(hRes == S_OK);
IImageEncoder *pImageEncoder = NULL;
IImageDecoder *pImageDecoder = NULL;
IImagingFactory *pImagingFactory = NULL;
IImageSink *pImageSink = NULL;
ImageInfo rImgInfo;
CLSID clsidEncodeID;
UINT uCount;
ImageCodecInfo *codecs;
const GTCHAR *m_szJPGMimeType = L"image/jpeg";
if(S_OK != CoCreateInstance(CLSID_ImagingFactory, NULL,
CLSCTX_INPROC_SERVER, IID_IImagingFactory , (GVOID **)&pImagingFactory))
{
ASSERT(0);
}
hRes = pImagingFactory->GetInstalledEncoders(&uCount, &codecs);
UINT i = 0;
for (i = 0; i < uCount; i++)
{
if(!GStrCmp(m_szJPGMimeType, codecs[i].MimeType))
{
clsidEncodeID = codecs[i].Clsid;
break;
}
}
CoTaskMemFree(codecs);
codecs = NULL;
if (i == uCount)
{
goto end;
}
hRes = pImagingFactory->CreateImageEncoderToFile(&clsidEncodeID, L"Storage Card\\2.jpg", &pImageEncoder);
ASSERT(hRes == S_OK);
hRes = pImageEncoder->GetEncodeSink(&pImageSink);
ZeroMemory( &rImgInfo , sizeof( ImageInfo ) );
rImgInfo.RawDataFormat = ImageFormatMemoryBMP;
rImgInfo.PixelFormat = PixelFormat32bppRGB;
/*rImgInfo.Xdpi = 72;
rImgInfo.Ydpi = 72;
rImgInfo.TileWidth = 240;
rImgInfo.TileHeight = 320;*/
rImgInfo.Flags = SinkFlagsTopDown | SinkFlagsFullWidth;
rImgInfo.Width = 240;
rImgInfo.Height = 320;
BitmapData rBitMapData;
rBitMapData.Height = 320;
rBitMapData.Width = 240;
rBitMapData.PixelFormat = PixelFormat32bppRGB;
rBitMapData.Stride = 240 * 4;
GVOID *pVoidBuf = (GVOID *)GAlloc(320 * 240 * 4);
for (GINT32 i4 = 0; i4 < 320 * 240; i4++)
{
const GCHAR *szColor = "\x40\x50\xff";
GMemCpy((GVOID *)((GINT32)pVoidBuf + i4 * 4), szColor, 4);
}
rBitMapData.Scan0 = pVoidBuf;
rBitMapData.Reserved = 0;
RECT rect, SubRect;
rect.top = 0;
rect.bottom = 320;
rect.left = 0;
rect.right = 240;
hRes = pImageSink->BeginSink(&rImgInfo, &SubRect);
ASSERT(hRes == S_OK);
hRes = pImageSink->PushPixelData(&rect, &rBitMapData, TRUE); //若将PixelFormat32bppRGB替换为PixelFormat24bppRGB,则此处的返回值为
//E_INVALIDARG ASSERT(hRes == S_OK);
pImageSink->EndSink(S_OK);
// We now have an encoder and a decoder.
pImageEncoder->TerminateEncoder();
end:
if (pImageSink)
pImageSink->Release();
if (pImageEncoder)
pImageEncoder->Release();
if (pImagingFactory)
pImagingFactory->Release();
CoUninitialize();
return (TRUE);
时间紧急,还忘高人指点