5

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.

4

3 回答 3

8

我有工作样本:

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

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);  
于 2008-10-08T15:56:31.047 回答
0

我在让我的透明渠道正常工作时遇到了类似的问题。就我而言,我知道透明区域应该使用什么背景颜色(它是纯色的)。我使用了 Bitmap.GetHBITMAP(..) 方法并传入了用于透明区域的背景颜色。这是一个更简单的解决方案,我尝试使用 LockBits 并使用 PixelFormat32bppARGB 重新创建位图以及克隆。在我的例子中,Bitmap 忽略了 alpha 通道,因为它是从 Bitmap.FromStream 创建的。

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

请参阅我的问题和解决方案

白色背景的 JPG 的 GDI+ DrawImage 不是白色的

于 2011-01-05T16:39:42.790 回答
-1

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.

于 2008-10-08T14:22:02.920 回答