2011-10-21 27 views
6

Tôi muốn gọi phương thức có màu đối số. Nhưng có rất nhiều màu sắc khác nhau chỉ bằng bóng râm. Làm thế nào tôi có thể tìm thấy các màu sắc khác với màu của tôi chỉ một chút, ví dụ như AntiqueWhite và Bisque. Here's bảng màu.C# tìm các màu tương tự

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

Sử dụng một treshold của một sự thay đổi tối đa của R, G hoặc B (hoặc cả ba) – RvdK

+0

nào bạn muốn làm gì với kết quả của bạn? – alexn

+0

có thể trùng lặp của [việc tìm kiếm các màu tương tự theo chương trình] (http://stackoverflow.com/questions/1725505/finding-similar-colors-programatically) –

Trả lời

6

tôi thấy thói quen here này:

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

WebColors là gì? –

+0

Đó là bảng màu. Hãy xem [ở đây] (http://pietschsoft.com/post/2006/06/29/C-NET-Convert-SystemDrawingColor-to-HTML-color.aspx) để chuyển đổi nó thành một cái gì đó khác nhau – Marco

+0

Không có lý do thực sự để lấy căn bậc hai. giá trị gần nhất sẽ là giá trị gần nhất, ngay cả khi không thêm hoạt động CPU nặng đó. – Nyerguds

11

bạn có thể sử dụng một phương pháp như thế này:

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

phương pháp này có hai màu sắc và khả năng chịu đựng và trả về cho dù hai màu sắc là gần hay không dựa trên các giá trị RGB của họ. Tôi nghĩ rằng nên làm các trick nhưng bạn có thể cần phải mở rộng để bao gồm độ sáng và độ bão hòa.

+3

Một cái gì đó khác để xem xét, đang làm điều tương tự, nhưng trong không gian màu HSV. –

2

Phân tích ví dụ này Find the Nearest Color with C#. Hy vọng cung cấp cho bạn một ý tưởng.

enter image description 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); 
    // 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; 
    } 
} 
+0

Bạn vừa đăng cùng một thường trình được lấy từ cùng một trang web :) – Marco

+0

WebColors là gì? –

+0

Như bạn có thể thấy trong chú giải công cụ dấu thời gian, cả hai câu trả lời đều được tạo gần thời gian. –

0

Tôi nghĩ để tìm màu sắc tương tự như bạn nên có một cái nhìn tại HSL or HSB color space thay vì RGB một, gây ra với điều này sẽ dễ dàng hơn rất nhiều để tìm màu sắc tương tự.

Trong vòng .Net, bạn có thể gọi phương thức GetHue(), GetSaturation()GetBrightness() để nhận các giá trị này từ một màu nhất định và so sánh các giá trị này để tìm các giá trị tương tự.

Nếu bạn cần cách quay trở lại từ giá trị HSB sang màu, bạn cũng có thể sử dụng this method.

3

Bạn có thể nhận được màu gần nhất từ ​​KnownColors enum.

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

Và phương pháp hỗ trợ

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); 
} 
+0

Giải pháp tuyệt vời! Bạn có thể cập nhật nó để sử dụng Windows.UI.Color và Windows.UI.Colors, khi lập trình Universal Windows Apps? Cảm ơn bạn. – AnAurelian

1

tôi đã sử dụng câu trả lời Keven Holditch của bên dưới. Nhưng tôi đã sửa đổi nó cho mục đích của riêng tôi. Phiên bản này sử dụng độc quyền hoặc để chỉ có một giá trị có thể được tắt bởi sự khoan dung và vẫn trở lại đúng sự thật. (Dung sai cũng là < = thay vì chỉ <.)

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; 
} 
Các vấn đề liên quan