C# 寻找相似的颜色

C# 寻找相似的颜色,c#,colors,C#,Colors,我想用参数颜色调用一个方法。但是有很多颜色只有一个色调不同。我怎样才能找到与我的颜色只有一点点不同的颜色,例如AntiqueWhite和Bisque。调色板 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.MakeTrans

我想用参数颜色调用一个方法。但是有很多颜色只有一个色调不同。我怎样才能找到与我的颜色只有一点点不同的颜色,例如AntiqueWhite和Bisque。调色板

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);

你能用这样的方法吗

 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;
 }
public bool颜色相似(颜色c1、颜色c2、内部公差)
{
返回数学Abs(c1.R-c2.R)<公差&&
数学Abs(c1.G-c2.G)<公差&&
数学Abs(c1.B-c2.B)<公差;
}
此方法采用两种颜色和一个公差,并根据它们的RGB值返回这两种颜色是否接近。我认为应该这样做,但您可能需要扩展到包括亮度和饱和度。

我发现了以下例行程序:

Color\u Color=Color.Empty;
foreach(网络颜色中的对象o)
{
//计算两种颜色之间的欧几里德距离
//注意,本例中未使用alpha组件
dbl_test_red=Math.Pow(Convert.ToDouble((Color)o.R)-dbl_input_red,2.0);
dbl_test_green=Math.Pow(Convert.ToDouble
((颜色)o.G)-dbl_输入_绿色,2.0);
dbl_test_blue=Math.Pow(Convert.ToDouble
((颜色)o.B)-dbl_输入_蓝色,2.0);
temp=数学Sqrt(蓝色+绿色+红色);
//探索结果并存储最接近的颜色
如果(温度=0.0)
{
最近的_颜色=(颜色)o;
打破
}
否则如果(温度<距离)
{
距离=温度;
最近的_颜色=(颜色)o;
}
}
分析此示例。希望给你一个想法

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;
    }
}

Color\u Color=Color.Empty;
foreach(网络颜色中的对象o)
{
//计算两种颜色之间的欧几里德距离
//注意,本例中未使用alpha组件
dbl_test_red=Math.Pow(Convert.ToDouble((Color)o.R)-dbl_input_red,2.0);
dbl_test_green=Math.Pow(Convert.ToDouble
((颜色)o.G)-dbl_输入_绿色,2.0);
dbl_test_blue=Math.Pow(Convert.ToDouble
((颜色)o.B)-dbl_输入_蓝色,2.0);
//不需要计算平方根
//应充分利用:
//温度=dbl_测试蓝色+dbl_测试绿色+dbl_测试红色;
//如果计划这样做,则距离应初始化为250000.0
temp=数学Sqrt(蓝色+绿色+红色);
//探索结果并存储最接近的颜色
如果(温度=0.0)
{
//最低可能的距离当然是零
//所以我可以打破这个循环(感谢威利·德希曼)
//在这里,我可以返回输入颜色本身
//但是在这个例子中,我使用了一个带有命名颜色的列表
//我还想返回Name属性
最近的_颜色=(颜色)o;
打破
}
否则如果(温度<距离)
{
距离=温度;
最近的_颜色=(颜色)o;
}
}

我认为,要找到相似的颜色,您应该查看RGB颜色,而不是RGB颜色,因为这样更容易找到相似的颜色

在.Net中,您可以调用、和方法从给定颜色中获取这些值,并比较这些值以找到相似的值


如果您需要从HSB值返回到颜色,您也可以使用。

您可以从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);

我在下面使用了Keven Holditch的答案。但我为了自己的目的修改了它。此版本使用异或,因此公差只能关闭一个值,并且仍然返回true。(公差也可使用R、G或B(或全部三者)最大变化的阈值)你想对你的结果做些什么?可能的副本“ErNO”我看到了,但它对我没有帮助。@ Alxn获得论点颜色的方法,使颜色透明。需要考虑的是,做同样的事情,但是在HSV颜色空间。你刚刚发布了同一个站点的相同例程:正如您在时间戳工具提示中所看到的,这两个答案都是在关闭时间创建的。@user966638
WebColors=GetWebColors()你可以在解决方案中找到。我在我的评论末尾放了一个微笑,因为我知道这种情况经常发生!!对我来说没问题:)只是告诉你我们找到了相同的资源;)@马可,我今天过得很糟糕。对不起,这是调色板。看一看,把它转换成不同的东西,虽然没有真正的理由取平方根。最接近的值将是最接近的值,即使不添加CPU繁重的操作。伟大的解决方案!在编写通用Windows应用程序时,能否将其更新为使用Windows.UI.Color和Windows.UI.Color?非常感谢。
// 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);
}
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;
}