我想用参数颜色调用方法。但是有很多颜色只有阴影才有区别。我怎样才能找到与我的颜色不同的颜色,例如AntiqueWhite和Bisque。 Here's调色板。
Bitmap LogoImg = new Bitmap("file1.jpeg");//the extension can be some other
System.Drawing.Color x = LogoImg.GetPixel(LogoImg.Width-1, LogoImg.Height-1);
LogoImg.MakeTransparent(x);
image1.Source = GetBitmapSource(LogoImg);
答案 0 :(得分:11)
你能使用这样的方法:
public bool AreColorsSimilar(Color c1, Color c2, int tolerance)
{
return Math.Abs(c1.R - c2.R) < tolerance &&
Math.Abs(c1.G - c2.G) < tolerance &&
Math.Abs(c1.B - c2.B) < tolerance;
}
此方法采用两种颜色和公差,并根据RGB值返回这两种颜色是否接近。我认为应该这样做,但你可能需要扩展到包括亮度和饱和度。
答案 1 :(得分:6)
我发现了这个例程here:
Color nearest_color = Color.Empty;
foreach (object o in WebColors)
{
// compute the Euclidean distance between the two colors
// note, that the alpha-component is not used in this example
dbl_test_red = Math.Pow(Convert.ToDouble(((Color)o).R) - dbl_input_red, 2.0);
dbl_test_green = Math.Pow(Convert.ToDouble
(((Color)o).G) - dbl_input_green, 2.0);
dbl_test_blue = Math.Pow(Convert.ToDouble
(((Color)o).B) - dbl_input_blue, 2.0);
temp = Math.Sqrt(dbl_test_blue + dbl_test_green + dbl_test_red);
// explore the result and store the nearest color
if(temp == 0.0)
{
nearest_color = (Color)o;
break;
}
else if (temp < distance)
{
distance = temp;
nearest_color = (Color)o;
}
}
答案 2 :(得分:3)
您可以从KnownColors枚举中获得最接近的颜色。
// A color very close to Rosy Brown
var color = Color.FromArgb(188, 143, 142);
var colors = Enum.GetValues(typeof (KnownColor))
.Cast<KnownColor>()
.Select(Color.FromKnownColor);
var closest = colors.Aggregate(Color.Black,
(accu, curr) =>
ColorDiff(color, curr) < ColorDiff(color, accu) ? curr : accu);
支持方法
private int ColorDiff(Color color, Color curr)
{
return Math.Abs(color.R - curr.R) + Math.Abs(color.G - curr.G) + Math.Abs(color.B - curr.B);
}
答案 3 :(得分:2)
分析此示例Find the Nearest Color with C#
。希望给你一个想法。
Color nearest_color = Color.Empty;
foreach (object o in WebColors)
{
// compute the Euclidean distance between the two colors
// note, that the alpha-component is not used in this example
dbl_test_red = Math.Pow(Convert.ToDouble(((Color)o).R) - dbl_input_red, 2.0);
dbl_test_green = Math.Pow(Convert.ToDouble
(((Color)o).G) - dbl_input_green, 2.0);
dbl_test_blue = Math.Pow(Convert.ToDouble
(((Color)o).B) - dbl_input_blue, 2.0);
// it is not necessary to compute the square root
// it should be sufficient to use:
// temp = dbl_test_blue + dbl_test_green + dbl_test_red;
// if you plan to do so, the distance should be initialized by 250000.0
temp = Math.Sqrt(dbl_test_blue + dbl_test_green + dbl_test_red);
// explore the result and store the nearest color
if(temp == 0.0)
{
// the lowest possible distance is - of course - zero
// so I can break the loop (thanks to Willie Deutschmann)
// here I could return the input_color itself
// but in this example I am using a list with named colors
// and I want to return the Name-property too
nearest_color = (Color)o;
break;
}
else if (temp < distance)
{
distance = temp;
nearest_color = (Color)o;
}
}
答案 4 :(得分:1)
我在下面使用了Keven Holditch的答案。但我为了自己的目的修改了它。此版本使用exclusive-or,因此只有一个值可以通过容差关闭并仍然返回true。 (容差也是&lt; =而不仅仅是&lt;。)
private bool AreColorsSimilar(Color c1, Color c2, int tolerance)
{
return Math.Abs(c1.R - c2.R) <= tolerance ^
Math.Abs(c1.G - c2.G) <= tolerance ^
Math.Abs(c1.B - c2.B) <= tolerance;
}
答案 5 :(得分:0)
我认为要找到相似的颜色,你应该看一下HSL or HSB color space而不是RGB的颜色,因此找到相似的颜色要容易得多。
在.Net中,您可以调用GetHue()
,GetSaturation()
和GetBrightness()
方法从给定颜色中获取这些值,并比较这些值以找到类似的值。
如果您需要从HSB值返回颜色的方式,您还可以使用this method。