我有一个有效的HBITMAP
句柄,类型为ARGB
。如何使用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.FromStream创建的,所以位图忽略了Alpha通道。
我还遇到了一些非常奇怪的问题,即我的图像背景区域发生了轻微变化。例如,它不是纯白色,而是类似于0xfff7f7的灰白色。无论我是使用带混合颜色的JPG还是带有透明颜色的PNG,都会出现这种情况。
请参见我的问题和解决方案: