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

时间:2008-10-08 14:12:46

标签: image gdi+

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

我试过方法: graphics.DrawImage(Bitmap :: FromHBITMAP(m_hBitmap,NULL),0,0); 但它不使用alpha通道。

4 个答案:

答案 0 :(得分:7)

我有工作样本:

// 1.使用位图句柄获取信息:图像大小,位
BITMAP bmpInfo;
::GetObject(m_hBitmap, sizeof(BITMAP), &bmpInfo);
int cxBitmap = bmpInfo.bmWidth;
int cyBitmap = bmpInfo.bmHeight;
void* bits = bmpInfo.bmBits;

// 2.创建&使用像素格式为PixelFormat32bppARGB 的位绘制新的GDI +位图 Gdiplus::Graphics graphics(dcMemory);
Gdiplus::Bitmap bitmap(cxBitmap, cyBitmap, cxBitmap*4, PixelFormat32bppARGB, (BYTE*)bits);
graphics.DrawImage(&bitmap, 0, 0);

答案 1 :(得分:0)

.NET提供静态Image.FromHbitmap方法。然后,您可以使用此图像并在目标DrawImage对象上调用Graphics

答案 2 :(得分:0)

啊......但.Net不使用HBITMAP,而GDI +是基本Windows GDI上的C ++库,所以我假设你使用的是非.Net C ++。

GDI +有一个Bitmap类,它有一个FromHBITMAP()方法。

获得GDI + Bitmap实例后,可以将其与GDI +库一起使用。

当然,如果您可以使用.Net在C#中编写程序,那将会更容易。

答案 3 :(得分:0)

我有类似的问题让我的透明频道发挥作用。就我而言,我知道透明区域应该使用什么背景颜色(它是实心的)。我使用了Bitmap.GetHBITMAP(..)方法并传入了用于透明区域的背景颜色。这是一个更容易的解决方案,其他尝试我尝试使用LockBits并使用PixelFormat32bppARGB重新创建Bitmap,以及克隆。在我的例子中,Bitmap忽略了alpha通道,因为它是从Bitmap.FromStream创建的。

我的图像背景区域略有改变,我也有一些非常奇怪的问题。例如,它不像纯白色,而是像0xfff7f7一样白色。无论我使用的是JPG(混合色)还是PNG和透明色,都是如此。

上查看我的问题和解决方案

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