如何使用GDI+绘制ARGB位图?

5

我有一个有效的HBITMAP句柄,类型为ARGB。如何使用GDI+绘制它?

我尝试过以下方法:

graphics.DrawImage(Bitmap::FromHBITMAP(m_hBitmap, NULL), 0, 0);

但它不使用alpha通道。
3个回答

9

我有一个可用的样例:

使用位图句柄获取信息:图像大小、位数

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);  

0

我曾经遇到过类似的问题,无法让我的透明通道正常工作。在我的情况下,我知道应该使用什么背景颜色来代替透明区域(它是纯色的)。我使用了Bitmap.GetHBITMAP(..)方法,并传入要用于透明区域的背景颜色。这比其他尝试使用LockBits和重新创建PixelFormat32bppARGB位图以及克隆位图的解决方案要简单得多。在我的情况下,由于它是从Bitmap.FromStream创建的,所以位图忽略了Alpha通道。

我还遇到了一些非常奇怪的问题,即我的图像背景区域发生了轻微变化。例如,它不是纯白色,而是类似于0xfff7f7的灰白色。无论我是使用带混合颜色的JPG还是带有透明颜色的PNG,都会出现这种情况。

请参见我的问题和解决方案:

GDI+ DrawImage of a JPG with white background is not white


-1
啊...但是.Net不使用HBITMAP,而GDI+是基于基本Windows GDI的C++库,所以我假设你正在使用非.Net的C++。
GDI+有一个Bitmap类,其中包含一个FromHBITMAP()方法。
一旦您拥有了GDI+ Bitmap实例,就可以将其与GDI+库一起使用。
当然,如果您可以使用.Net中的C#编写程序,那将会更容易。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接