2009-10-01 98 views
3

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

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

蒙版的颜色是任意的,应该是准确的,并且如果透明度可能存在阈值,它将是一个加号。

回答

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; 

我不明白你的意思通过“这将是一个加,如果可以有一个透明度阈值”,虽然...所以也许这不是你要找的答案?

+0

这不是这么回事。转换只需要在可见/不可见(而不是维护它)方面遵守源阿尔法。因此,阈值指示可见度限制(即α> = 20?可见:不可见)。所有可见的像素都应该使用统一的颜色来绘制,而所有看不见的像素都不应该被绘制。统一的颜色应该是ARGB(而不仅仅是RGB),并且应该是准确的(我不确定漂浮物可以保持1/255的多好) – sold 2009-10-04 09:14:26

+0

啊,我以为我错过了一些东西!那么,我肯定会通过逐像素扫描来创建一个新的图像。至少它会比ImageAttribute解决方案快得多。 – 2009-10-04 09:30:03

1

我必须绘制每像素alpha蒙版的图像,发现最好的方法是绘制基本的RGB图像,然后在顶部绘制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 
} 

我的阿尔法面具是唯一的全透明或不透明的全面,但我认为,设置其他α值在调色板将让你跟随更加毕业的面具。

palette->Entries[1] = DLIMAKEARGB(254, 0, 0, 200); 
palette->Entries[2] = DLIMAKEARGB(253, 0, 0, 200); 
etc.. 

希望这有助于(或至少是有道理的:-P)