【问题标题】:HBITMAP to JPEG /PNG without CImage in C++C++ 中没有 CImage 的 HBITMAP 到 JPEG /PNG
【发布时间】:2012-11-13 08:13:43
【问题描述】:

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

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

我从哪里开始?

【问题讨论】:

  • 喜欢 jpeglib 或 pnglib 或其他名称?谷歌一下?

标签: c++ png jpeg hbitmap


【解决方案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;          // number of image encoders
   UINT  size = 0;         // size of the image encoder array in bytes

   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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2010-12-04
      • 2018-01-08
      • 2011-12-11
      • 2011-03-15
      • 1970-01-01
      • 2012-07-06
      • 2015-01-16
      • 2016-04-03
      • 2012-05-14
      相关资源
      最近更新 更多