3

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

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

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

4

2 回答 2

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)

于 2009-11-12T12:04:07.120 回答
0

您的意思是要将位图中的每种现有颜色转换为一种统一的颜色,同时完全尊重图像中存在的 alpha/透明度信息吗?

如果是这样,只需使用以下颜色矩阵:

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;

我不明白你的意思是“如果可以有透明度的阈值,那将是一个加号”,但是......所以也许这不是你正在寻找的答案?

于 2009-10-04T08:30:20.210 回答