gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:29:56 24 4
gpt4 key购买 nike

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

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

我从哪里开始?

最佳答案

如果您可以访问 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

关于c++ - 在 C++ 中没有 CImage 的 HBITMAP 到 JPEG/PNG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13554905/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com