2012-05-22 84 views
0

我有一种情况,我想采取Bitmap并通过它替换给定颜色的不同颜色。我原来的计划是通过Dictionary<Color, Color>,然后遍历所有像素,检查当前颜色是否在字典/地图中,然后在需要时进行替换。比较忽略alpha分量的颜色

但是,如果原始图像有任何alpha我想保留该alpha。我很迷惑最好的方法来检查字典中的颜色是否忽略了alpha分量。

的方式,我拿出这么远只是为了创建一个新的RGBOnlyColor类或相似的,用它来代替Color在我的字典里,看着它转换前的颜色,我从GetPixel这个搞定。这似乎是相当矫枉过正,所以我想知道是否有任何我错过了,使它更简单...

另一种选择是创建一个ColorMap类,这将是一个简单的扩展字典,当设置和检索只是迫使阿尔法为已知值,以确保它是无关紧要......

所以任何人可以帮助我做什么最好的方法是什么?总之我想换颜色的图像在离开阿尔法部分完好,但它是难度比它看起来应该是... :)

回答

2

一种直接的方法是归零在字典中查找每种颜色的alpha通道,然后在映射颜色解析后注入正确的alpha值。

实施例:

Color colorFromBitmap; // assume already have this 
var colorToLookup = Color.FromArgb(0, colorFromBitmap); 
var mappedColor = dictionary[colorToLookup]; 
var finalResult = Color.FromArgb(colorFromBitmap.A, mappedColor); 

由于阿尔法设置为0颜色在词典查找之前,词典内的颜色应该都具有0阿尔法为好。

+0

D'oh!当然这很简单。在对照字典进行测试之前,我甚至没有想过修改从图像中获得的颜色。 :) – Chris

1

要比较的颜色,但不包括阿尔法的比较,你不需要任何超过这个:

bool RGBequal(Color c1, Color c2) 
{ 
    return c1.R==c2.R && c1.G==c2.G && c1.B==c2.B; 
} 

要实现你的字典为基础的方法,你可以填充有使用Color.FromArgb(r, g, b) 255的阿尔法值的颜色字典。也许使用扩展方法:

Color Opaque(this Color color) 
{ 
    return Color.FromArgb(color.R, color.G, color.B); 
} 

创建一个新的颜色,从一种颜色与RGB从另一个颜色结合α通道是很简单的:

Color.FromArgb(color1.A, color2.R, color2.G, color2.B);