鉴于图像,我想将指定颜色附近的像素(如Color.FromArgb(210, 189, 51)
)转换为透明区域。
我试过了:
public Bitmap MakeTransparent(Image image,Color clr)
{
Bitmap b = new Bitmap(image);
var replacementColour = Color.FromArgb(255, 255, 255);
var tolerance = 1;
for (int i = b.Size.Width - 1; i >= 0; i--)
{
for (int j = b.Size.Height - 1; j >= 0; j--)
{
var col = b.GetPixel(i, j);
if (clr.R - col.R < tolerance &&
clr.G - col.G < tolerance &&
clr.B - col.B < tolerance)
{
b.SetPixel(i, j, replacementColour);
}
}
}
b.MakeTransparent(replacementColour);
return b;
}
但结果是错误的。
答案 0 :(得分:1)
您应该了解metrics。
无论如何,如果转换了不好的颜色,由于你的测试,它的明显:
if (clr.R - col.R < tolerance && clr.G - col.G < tolerance && clr.B - col.B < tolerance)
如果clr
说(100,100,100)
(light gray),则RGB小于99的任何颜色都会通过测试。与(75,57,37)
(dark shitty brown)...
您可以使用Math.Abs:
if (Math.Abs(clr.R - col.R) < tolerance &&
Math.Abs(clr.G - col.G) < tolerance &&
Math.Abs(clr.B - col.B) < tolerance)
作为评论,如果tolerance
为1
,则会检查Math.Abs(d) < 1
,其等同于d == 0
。因此,如果容差为1
,则实际上会检查颜色是否相等。
您可以使用:
if (Math.Abs(clr.R - col.R) <= tolerance &&
Math.Abs(clr.G - col.G) <= tolerance &&
Math.Abs(clr.B - col.B) <= tolerance)
在这种情况下,当tolerance
等于0
时,检查颜色相等。
此外,您应该直接将匹配像素设置为透明而不是将其设置为白色并使用您之前的函数:
var replacementColour = Color.Transparent;
... // for loops
if (Math.Abs(clr.R - col.R) < tolerance &&
Math.Abs(clr.G - col.G) < tolerance &&
Math.Abs(clr.B - col.B) < tolerance)
{
b.SetPixel(i, j, replacementColour);
}
这样做可能不是 好方法,因为色彩距离是一个很大的主题。你应该了解这一点: