我有一种情况,我想采用Bitmap
并通过它替换不同颜色的给定颜色。我最初的计划是传入一个Dictionary<Color, Color>
,然后遍历所有像素,检查当前颜色是否在字典/地图中,然后根据需要进行替换。
但是,如果原始图像有任何alpha我想保留该alpha。我很困惑最好的方法来检查字体中的颜色是否忽略了alpha组件。
到目前为止,我提出的方法只是创建一个新的RGBOnlyColor
类或类似的,并在我的字典中使用它而不是Color
并转换我从{{1}获得的颜色在查找它之前先这样做。这似乎相当矫枉过正,所以我想知道是否有任何我错过的东西让它变得更简单......
另一个选项是创建一个ColorMap类,它是字典的简单扩展,在设置和检索时只强制alpha到一个已知值,以确保它是无关的......
所以有人可以帮我解决最好的方法吗?总而言之,我想在图像中交换颜色,使alpha部分保持原样,但它比看起来更难......:)
答案 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。