我有ARGB类型的有效HBITMAP句柄。如何使用GDI +绘制它?
我试过方法: graphics.DrawImage(Bitmap :: FromHBITMAP(m_hBitmap,NULL),0,0); 但它不使用alpha通道。
答案 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和透明色,都是如此。
在
上查看我的问题和解决方案