【问题标题】:Completely transparent image完全透明的图像
【发布时间】:2011-12-02 13:14:13
【问题描述】:

有谁知道我如何创建一个完全透明的图像或给定的图像 (HBITMAP) 我怎样才能完全擦除它以使其中的所有像素都 100% 透明?

谢谢。

【问题讨论】:

  • 如果整个图像都是透明的,那为什么还要有图像呢?
  • 我想将此图像用作其他操作的基础。

标签: c++ windows bitmap gdi


【解决方案1】:

位图需要为 32 位,因此它有一个 Alpha 通道,您可以使用该通道设置不透明度值。如果您的图像不是 32 位的,则必须创建一个新的 32 位位图并将原始像素复制到其中。

【讨论】:

  • 问题是如何创建此图像以及如何设置不透明度值? 'CreateBitmap' 没有给我任何设置不透明度的方法。
  • CreateBitmap() 允许您创建 32 位位图,但没有用于设置像素不透明度的 API。您必须直接操作像素数据。 CreateBitmap() 返回一个指向原始像素数据的指针,这是一个二维像素数组。对于 32 位位图,每个像素为 4 个字节,使数据中的每个第 4 个字节成为特定像素的 Alpha 通道。
  • 你能指出任何设置第 4 个字节的例子吗?这是一个纯 API 应用程序。
  • 只需将CreateBitmap() 返回的数据指针类型转换为RGBQUAD* 指针,然后您可以循环遍历数组,根据需要更新值。 RGBQUAD.rgbReserved 字段是每个像素的 alpha 通道。
【解决方案2】:

我也找到了不使用 GDI+ 的解决方案。

BITMAPV5HEADER bi = {sizeof(BITMAPV5HEADER), 320, 240, 1, 32, BI_BITFIELDS, 0, 0, 0, 0, 0, 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000};
HDC hDc = ::CreateCompatibleDC(0);

if(NULL != hDc)
{
    RGBQUAD* pArgb;
    HBITMAP tBmp = ::CreateDIBSection(hDc, (BITMAPINFO*)&bi, DIB_RGB_COLORS, (void**)&pArgb, NULL, 0);

    if(NULL != tBmp)
    {
        int x, y;
        DWORD pBits;

        pBits = (DWORD*)pArgb;
        for(y = 0; y < bi.bV5Height; y++)
        {
            for(x = 0; x < bi.bV5Width; x++)
            {
                *pBits = 0;
                pBits++;
            }
        }
    }
    ::DeleteObject(hDc);
}

tB​​mp 将是一个完全透明的 320 x 240 位图

【讨论】:

    【解决方案3】:

    您可以使用单色位图作为蒙版,从彩色位图创建透明图像。这是相当复杂的。请参阅this 示例(在 VB 中但直接使用 Win32 API)

    或者,TransparentBlt 函数可能会使您尝试做的事情变得不必要。

    【讨论】:

      【解决方案4】:

      我在 GDI+ 中找到了答案。最好的方法是附加您正在使用 GDI+ 图形对象的图像的设备上下文,然后调用它的 clear 方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-04
        • 1970-01-01
        • 2014-02-23
        • 1970-01-01
        相关资源
        最近更新 更多