比较忽略alpha分量的颜色

时间:2012-05-22 09:36:38

标签: c# .net

我有一种情况,我想采用Bitmap并通过它替换不同颜色的给定颜色。我最初的计划是传入一个Dictionary<Color, Color>,然后遍历所有像素,检查当前颜色是否在字典/地图中,然后根据需要进行替换。

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

到目前为止,我提出的方法只是创建一个新的RGBOnlyColor类或类似的,并在我的字典中使用它而不是Color并转换我从{{1}获得的颜色在查找它之前先这样做。这似乎相当矫枉过正,所以我想知道是否有任何我错过的东西让它变得更简单......

另一个选项是创建一个ColorMap类,它是字典的简单扩展,在设置和检索时只强制alpha到一个已知值,以确保它是无关的......

所以有人可以帮我解决最好的方法吗?总而言之,我想在图像中交换颜色,使alpha部分保持原样,但它比看起来更难......:)

2 个答案:

答案 0 :(得分:2)

要比较颜色,不包括alpha的比较,您不需要更多:

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

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

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

创建一种新颜色,将一种颜色的Alpha通道与另一种颜色的RGB结合起来非常简单:

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

答案 1 :(得分: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);

由于在字典中查找颜色之前将alpha设置为0,因此字典中的颜色也应该都有0 alpha。