Image::FromStream(pStream) 返回0

GDI+ PNG透明按钮问题解决
本文介绍在使用GDI+处理PNG透明按钮时遇到的问题及解决方案。作者发现未初始化GDI+导致Image::FromStream返回0,通过正确初始化GDI+解决了问题。

转发地址:https://blog.youkuaiyun.com/q472599451/article/details/8675396

今天在做GDI,PNG的透明按钮时遇到一个问题,

pImage=Gdiplus::Image::FromStream(pStream);总是返回0;

原来是没有初始化GDI

Gdiplus::GdiplusStartupInput gdiplusStartupInput;

ULONG_PTR gdiplusToken;

//初始化GDI+.
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
头文件包含:
#include <GdiPlusInit.h>

#include <fstream> HBITMAP ScreenReceiver::CreateBitmapFromJpegData(const std::vector<BYTE>& vecJpegData) { if(vecJpegData.empty()) return NULL; if(m_gdiplusToken == 0) { GdiplusStartupInput gdiplusStartupInput; if(GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL) != Ok) { return NULL; } } IStream* pStream = nullptr; HBITMAP hBitmap = NULL; // 复制 JPEG 数据到 HGLOBAL HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, vecJpegData.size()); if(!hGlobal) return NULL; void* pData = GlobalLock(hGlobal); if(!pData) { GlobalFree(hGlobal); return NULL; } memcpy(pData, vecJpegData.data(), vecJpegData.size()); GlobalUnlock(hGlobal); #ifdef _DEBUG // 保存调试文件 std::ofstream outFile("received_debug.jpeg", std::ios::binary); outFile.write(reinterpret_cast<const char*>(vecJpegData.data()), vecJpegData.size()); #endif // CreateStreamOnHGlobal(TRUE) 会在释放流时自动释放 hGlobal if(CreateStreamOnHGlobal(hGlobal, TRUE, &pStream) != S_OK) { GlobalFree(hGlobal); return NULL; } LARGE_INTEGER liZero{}; pStream->Seek(liZero, STREAM_SEEK_SET, NULL); // ===== JPEG → GDI+ Bitmap(解码发生在这里) Gdiplus::Bitmap* pBitmap = Gdiplus::Bitmap::FromStream(pStream); pStream->Release(); // 释放流(会自动释放 hGlobal) if(!pBitmap || pBitmap->GetLastStatus() != Ok) { if(pBitmap) delete pBitmap; return NULL; } // ===== Bitmap → HBITMAP Gdiplus::Color whiteBg(255, 255, 255); if(pBitmap->GetHBITMAP(whiteBg, &hBitmap) != Ok) { delete pBitmap; return NULL; } // 手动释放 Bitmap 内存 delete pBitmap; return hBitmap; } 为什么我收到的 图片转换之后为空 显示jpeg 格式有问题?
最新发布
10-22
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值