在C ++中没有CImage的HBITMAP到JPEG / PNG

时间:2012-11-25 19:59:48

标签: c++ png jpeg hbitmap

我有一个HBITMAP,我想将其保存为JPEG / PNG流或字节数组。问题是我使用mingw作为我的编译器,所以我不能使用CImage ..这会让我的生活更轻松。

我可以毫无问题地从位图中获取像素,但我不知道如何以JPEG / PNG格式访问它们。

我从哪里开始?

2 个答案:

答案 0 :(得分:1)

如果您有权访问DirectX库,则可以使用IStream将图像转换为JPEG   http://msdn.microsoft.com/en-us/library/windows/desktop/aa380034(v=vs.85).aspx

或者如果你有GDI +这样的话可能会起作用

Gdiplus::Bitmap bmp(hbmpImage,(HPALETTE)0);
CLSID pngClsid;
GetEncoderClsid(L"image/png", &pngClsid);
bmp.Save(L"D:\image.png",&pngClsid,NULL);

GetEncoderLCLsid看起来像这样     int GetEncoderClsid(const WCHAR * format,CLSID * pClsid)     {        UINT num = 0; //图像编码器的数量        UINT大小= 0; //图像编码器阵列的大小(以字节为单位)

   ImageCodecInfo* pImageCodecInfo = NULL;

   GetImageEncodersSize(&num, &size);
   if(size == 0)
      return -1;  // Failure

   pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
   if(pImageCodecInfo == NULL)
      return -1;  // Failure

   GetImageEncoders(num, size, pImageCodecInfo);

   for(UINT j = 0; j < num; ++j)
   {
      if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
      {
         *pClsid = pImageCodecInfo[j].Clsid;
         free(pImageCodecInfo);
         return j;  // Success
      }    
   }

   free(pImageCodecInfo);
   return -1;  // Failure
}

不要忘记初始化GDI +

 GdiplusStartupInput gdiplusStartupInput;
   ULONG_PTR gdiplusToken;
   GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

如果没有访问权限,您可以使用libjpeg,但需要从GnuWin32站点放置所有依赖包。这个页面中的代码运行速度要快得多,只需忘记提升

libjpeg dying without message

答案 1 :(得分:0)

另一种选择是使用WIC API(Windows Imaging Component),它可以直接访问图像编码器和解码器。我相信GDI +可能会在幕后使用它。