HBITMAP到JPEG / PNG而不的CImage在C ++中(HBITMAP to JPEG

2019-07-04 03:00发布

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

我可以从位图的像素没有任何问题,但我不知道如何让JPEG / PNG格式的访问它们。

我从哪里开始?

Answer 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的死亡无消息



Answer 2:

另一种选择是使用WIC API (Windows图像处理组件),这使得图像编码器和解码器直接访问。 我相信GDI +可以使用这个在幕后。



文章来源: HBITMAP to JPEG /PNG without CImage in C++