【发布时间】:2010-09-16 00:40:47
【问题描述】:
我有ARGB 类型的有效HBITMAP 句柄。如何用GDI+画出来?
我试过方法:
graphics.DrawImage(Bitmap::FromHBITMAP(m_hBitmap, NULL), 0, 0);
但它不使用 alpha 通道。
【问题讨论】:
我有ARGB 类型的有效HBITMAP 句柄。如何用GDI+画出来?
我试过方法:
graphics.DrawImage(Bitmap::FromHBITMAP(m_hBitmap, NULL), 0, 0);
但它不使用 alpha 通道。
【问题讨论】:
我有工作样本:
使用位图句柄获取信息:图像大小,位
BITMAP bmpInfo;
::GetObject(m_hBitmap, sizeof(BITMAP), &bmpInfo);
int cxBitmap = bmpInfo.bmWidth;
int cyBitmap = bmpInfo.bmHeight;
void* bits = bmpInfo.bmBits;
使用像素格式 PixelFormat32bppARGB 的位创建和绘制新的 GDI+ 位图
Gdiplus::Graphics graphics(dcMemory);
Gdiplus::Bitmap bitmap(cxBitmap, cyBitmap, cxBitmap*4, PixelFormat32bppARGB, (BYTE*)bits);
graphics.DrawImage(&bitmap, 0, 0);
【讨论】:
我在让透明频道正常工作时遇到了类似的问题。就我而言,我知道透明区域应该使用什么背景颜色(它是纯色的)。我使用了 Bitmap.GetHBITMAP(..) 方法并传入了用于透明区域的背景颜色。这是一个更简单的解决方案,我尝试使用 LockBits 并使用 PixelFormat32bppARGB 重新创建位图以及克隆。在我的例子中,Bitmap 忽略了 alpha 通道,因为它是从 Bitmap.FromStream 创建的。
我也有一些非常奇怪的问题,我的图像的背景区域被稍微改变了。例如,它不是纯白色,而是像 0xfff7f7 这样的白色。无论我使用的是 JPG(混合色)还是 PNG 和透明色,都是这种情况。
查看我的问题和解决方案
【讨论】:
啊...但是 .Net 不使用 HBITMAP 并且 GDI+ 是基本 Windows GDI 之上的 C++ 库,所以我假设您使用的是非 .Net C++。
GDI+ 有一个 Bitmap 类,它有一个 FromHBITMAP() 方法。
拥有 GDI+ 位图实例后,您可以将其与 GDI+ 库一起使用。
当然,如果您可以使用 .Net 用 C# 编写程序,那会容易得多。
【讨论】: