2

我目前正在编辑一些旧的 GDI 代码以使用 GDI+,但在绘制具有透明背景的 BMP 文件时遇到了问题。旧的 GDI 代码没有使用任何明显的额外代码来绘制透明背景,所以我想知道如何使用 GDI+ 来实现这一点。

我当前的代码看起来像这样

HINSTANCE hinstance = GetModuleHandle(NULL);
bmp = Gdiplus::Bitmap::FromResource(hinstance, MAKEINTRESOURCEW(IDB_BMP));
Gdiplus::Graphics graphics(pDC->m_hDC);
graphics.DrawImage(&bmp, posX, posY);

我还尝试通过使用克隆方法并将位图绘制到新创建的位图从资源中创建一个新位图,但都没有帮助。两次我都使用了 PixelFormat32bppPARRGB。

然后我尝试使用 alpha 混合,但这样整个图像变得透明,而不仅仅是背景:

Gdiplus::ColorMatrix clrMatrix = { 
    1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
    0.0f, 1.0f, 0.0f, 0.0f, 0.0f,
    0.0f, 0.0f, 1.0f, 0.0f, 0.0f,
    0.0f, 0.0f, 0.0f, 0.5f, 0.0f,
    0.0f, 0.0f, 0.0f, 0.0f, 1.0f
};

Gdiplus::ImageAttributes imgAttr;
imgAttr.SetColorMatrix(&clrMatrix);

graphics.DrawImage(&bmp, destRect, 0, 0, width(), height(), Gdiplus::UnitPixel, &imgAttr);

透明度信息已包含在图像中,但我不知道如何在绘制图像时应用它。如何实现这一目标?

4

3 回答 3

2

一个迟到的答案,但是:

ImageAttributes imAtt;    
imAtt.SetColorKey(Color(255,255,255), Color(255,255,255), ColorAdjustTypeBitmap);  

将使white (255,255,255)您使用此图像属性的任何位图透明。

于 2015-06-09T00:15:19.567 回答
1

最简单的解决方案是使用 BMP 以外的其他格式。

您需要这些位来包含 alpha 数据,并且您需要 Bitmap 采用具有 alpha 数据的格式。当您使用 GDI+ 加载 BMP 时,它将始终使用不带 alpha 的格式,即使 BMP 具有 alpha 通道。我相信数据存在于图像位中,但没有被使用。

克隆或绘制到 PixelFormat32bppPARGB 位图时的问题是 GDI+ 会将图像数据转换为新格式,这意味着丢弃 alpha 数据。

假设它正确加载位,您需要做的是将位直接复制到另一个具有正确格式的位图。您可以使用Bitmap::LockBitsBitmap::UnlockBits来做到这一点。(确保使用其原始像素格式锁定每个位图,这样就不会进行任何转换。)

于 2012-07-28T01:32:16.123 回答
0

我有同样的问题。透明 BMP 没有正确显示,不幸的是,PNG 不能直接从资源中加载(除非添加相当多的代码,将它们复制到流中并从流中加载它们)。我想避免这段代码。
我使用的位图也只使用两种颜色(背景和徽标)。拥有一个 Alpha 通道意味着我需要用更高的颜色深度而不是只有 2 位颜色深度来保存它们。

埃文的回答正是我正在寻找的:-)

我使用左上角像素的颜色作为透明色,而不是白色:

Gdiplus::Color ColourOfTopLeftPixel;
Gdiplus::Status eStatus = m_pBitmap->GetPixel(0, 0, &ColourOfTopLeftPixel);
_ASSERTE(eStatus == Gdiplus::Ok);

// The following makes every pixel with the same colour as the top left pixel (ColourOfTopLeftPixel) transparent.
Gdiplus::ImageAttributes ImgAtt;
ImgAtt.SetColorKey(ColourOfTopLeftPixel, ColourOfTopLeftPixel, Gdiplus::ColorAdjustTypeBitmap);
于 2015-10-08T07:24:55.050 回答