我有一个要保存到JPEG/PNG流或字节数组中的HBITMAP。问题是我使用mingw作为我的编译器,所以我不能使用CImage。这会让我的生活更轻松。
我可以毫无问题地从位图中获取像素,但我不知道如何以JPEG/PNG格式访问它们。
我该从哪里开始呢?
发布于 2012-11-26 04:30:27
如果您有access JPEG库,您可以使用IStream将您的图像转换为DirectX 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站点中的所有依赖项包放入其中。这个页面中的代码应该运行得更快,只需忘记boost即可
发布于 2016-04-20 02:32:22
另一种选择是使用WIC API (Windows图像组件),它可以直接访问图像编码器和解码器。我相信GDI+可能会在幕后利用这一点。
https://stackoverflow.com/questions/13554905
复制相似问题