0

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

但是,如果原始图像有任何 alpha,我想保留该 alpha。我对检查颜色是否在字典中忽略 alpha 分量的最佳方法感到困惑。

到目前为止,我想出的方法只是创建一个新RGBOnlyColor类或类似的类并使用它而不是在我的字典中,并在查找之前Color将我得到的颜色转换为这个。GetPixel不过,这似乎有点矫枉过正,所以我想知道是否有什么我遗漏的东西可以让它变得更简单......

另一种选择是创建一个 ColorMap 类,这将是字典的简单扩展,在设置和检索时仅将 alpha 强制为已知值以确保它无关紧要......

那么任何人都可以帮助我解决这个问题的最佳方法是什么?总之,我想在图像中交换颜色,使 alpha 部分保持不变,但它比看起来更难...... :)

4

2 回答 2

2

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

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

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

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);
于 2012-05-22T09:45:59.787 回答
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在字典中查找颜色之前设置了 alpha,因此字典中的颜色也应该都有一个0alpha。

于 2012-05-22T09:59:59.890 回答