是否可以使用Graphics::DrawImage
绘制图像的transperancy蒙版(即,使用恒定颜色绘制所有可见像素)?我不是在寻找逐像素手动扫描图像并创建单独的蒙版图像,我想知道是否可以直接从原始图像中绘制图像。
我的猜测是,应该对ImageAttributes
进行某些操作,如果可能的话。
面具的颜色是任意的,应该是准确的,如果透明度可以有一个阈值,那将是一个加号。
答案 0 :(得分:1)
我必须使用每像素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)
答案 1 :(得分:0)
你的意思是你想要将位图中的每个现有颜色转换为一种统一的颜色,同时完全尊重图像中存在的alpha /透明度信息吗?
如果是这样,请使用以下colormatrix:
imageAttributes.SetColorMatrix( new ColorMatrix( new float[][] {
new float[] {0, 0, 0, 0, 0},
new float[] {0, 0, 0, 0, 0},
new float[] {0, 0, 0, 0, 0},
new float[] {0, 0, 0, 1, 0},
new float[] {r, g, b, 0, 1}} ) );
其中r,g,b介于0和1之间,如下所示:
float r = DesiredColor.R / 255f;
float g = DesiredColor.G / 255f;
float B = DesiredColor.B / 255f;
我不明白你的意思是“如果透明度可以有一个阈值,这将是一个加分”,尽管......所以这可能不是你想要的答案吗?