使用COM IImagingFactory相关的接口将BMP转化为JPG

yuanhong2910 2009-02-11 08:31:16
我需要将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);

时间紧急,还忘高人指点
...全文
227 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuanhong2910 2009-02-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xiang_yun 的回复:]
如果只是要把BMP转化为JPG ,可以用:
1、CImage不过要是VS.NET里面才能用
2、用CXImage,一个开源的库,很好用
[/Quote]
目前来说我只能用这个,但是还不会用。
xiang_yun 2009-02-12
  • 打赏
  • 举报
回复
如果只是要把BMP转化为JPG ,可以用:
1、CImage不过要是VS.NET里面才能用
2、用CXImage,一个开源的库,很好用

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧