我需要使用每像素的alpha掩码绘制图像,发现最好的方法是先绘制基本的RGB图像,然后在顶部绘制不透明部分的alpha掩码。您需要将每个alpha级别映射到一个alpha级别+颜色,以使图像尊重alpha掩码中的每个细节。我拥有的代码将alpha掩码作为单独的8位图像,但绘制代码如下:
g.DrawImage(&picture, r.left, r.top, r.Width(), r.Height()); // base image
if ( AlphaBuf != NULL ) // do we have and alpha mask?
{
Gdiplus::Bitmap mask(Width, Height, Width(), PixelFormat8bppIndexed, AlphaBuf);
picture.GetPalette( palette, picture.GetPaletteSize() );
// invert - only shows the transparent
palette->Entries[0] = DLIMAKEARGB(255, 0, 0, 200); // 0 = fully transparent
palette->Entries[255] = DLIMAKEARGB(0, 0, 0, 0); // 255 = fully opaque
mask.SetPalette(palette);
g.DrawImage(&mask, r.left, r.top, r.Width(), r.Height()); // draw the mask
}
我的 Alpha 遮罩只有完全透明或完全不透明,但我认为在调色板中设置其他 Alpha 值可以让您遵循更渐变的遮罩。
palette->Entries[1] = DLIMAKEARGB(254, 0, 0, 200)
palette->Entries[2] = DLIMAKEARGB(253, 0, 0, 200)
etc..
希望这有所帮助(或者至少讲得通 :-p)