I have valid HBITMAP
handle of ARGB
type. How to draw it using GDI+?
I've tried method:
graphics.DrawImage(Bitmap::FromHBITMAP(m_hBitmap, NULL), 0, 0);
But it doesn't use alpha channel.
我有工作样本:
使用位图句柄获取信息:图像大小,位
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 和透明色,情况都是如此。
请参阅我的问题和解决方案
Ah... but .Net doesn't use HBITMAP and GDI+ is a C++ library atop the basic Windows GDI, so I'm assuming you're using non-.Net C++.
GDI+ has a Bitmap class, which has a FromHBITMAP() method.
Once you have the GDI+ Bitmap instance, you can use it with the GDI+ library.
Of course, if you can write your program in C# using .Net it will be a lot easier.