GDI +,使用DrawImage绘制源图像的透明蒙版

时间:2009-10-01 18:18:27

标签: gdi+ image-manipulation transparency drawimage

是否可以使用Graphics::DrawImage绘制图像的transperancy蒙版(即,使用恒定颜色绘制所有可见像素)?我不是在寻找逐像素手动扫描图像并创建单独的蒙版图像,我想知道是否可以直接从原始图像中绘制图像。

我的猜测是,应该对ImageAttributes进行某些操作,如果可能的话。

面具的颜色是任意的,应该是准确的,如果透明度可以有一个阈值,那将是一个加号。

2 个答案:

答案 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;

我不明白你的意思是“如果透明度可以有一个阈值,这将是一个加分”,尽管......所以这可能不是你想要的答案吗?