【问题标题】:How to draw ARGB bitmap using GDI+?如何使用 GDI+ 绘制 ARGB 位图?
【发布时间】:2010-09-16 00:40:47
【问题描述】:

我有ARGB 类型的有效HBITMAP 句柄。如何用GDI+画出来?

我试过方法:

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

但它不使用 alpha 通道。

【问题讨论】:

    标签: image gdi+


    【解决方案1】:

    我有工作样本:

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

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

    【讨论】:

      【解决方案2】:

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

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

      查看我的问题和解决方案

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

      【讨论】:

        【解决方案3】:

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

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

        拥有 GDI+ 位图实例后,您可以将其与 GDI+ 库一起使用。

        当然,如果您可以使用 .Net 用 C# 编写程序,那会容易得多。

        【讨论】:

          猜你喜欢
          • 2019-11-03
          • 2014-08-01
          • 2022-08-17
          • 2021-11-09
          • 1970-01-01
          • 1970-01-01
          • 2012-03-31
          • 1970-01-01
          相关资源
          最近更新 更多