2012-07-30 2 views
13

이미지의 가장 많이 사용되는 색상을 찾으려면 응용 프로그램을 만들 때까지 색상의 RGB 값을 얻는 것이지만 색상 이름을 얻는 방법은 plz를 참조하십시오.C#에서 RGB 값을 갖는 동안 색상 이름을 얻는 방법은 무엇입니까?

+2

도움이 될 수 있습니다. http://stackoverflow.com/questions/365935/trying-to-convert-rgb-from-a-net-color-to-a-string-such-as-red-or- 파란색 – Habib

+0

[무엇을 시도 했습니까?] (http://whathaveyoutried.com)? 어디서 붙어 있니? 색상이 알려진 것 중 하나가 아닌 경우 어떻게 될 것으로 예상됩니까? – Oded

답변

2

System.Drawing 네임 스페이스의 Color 클래스를 사용할 수 있어야하며, Color 개체를 반환하는 정적 메서드 FromARGB가 있어야합니다. 그것은 당신과 같이 RGB 값을 입력 할 수 있도록 한 여러 오버로드가 있습니다

var color = Color.FromArgb(100, 5,5,5).Name; 
+0

문서에서 :'이 메소드는 이름에서 색상이 생성 된 경우 색상의 사용자 정의 이름 또는 알려진 색상의 이름을 반환합니다. 사용자 정의 색상의 경우 RGB 값이 반환됩니다. ' –

+3

** **'빨간색 '형식으로 이름이 반환되지 않습니다. 귀하의 예를 들어, 이름은 64050505로 나온다. – adrianbanks

+0

예, 그것은 이름을 얻는 방법 16 진수 값을 제공하고 있습니까? – fresky

11

이 방법은 Color 클래스에 미리 정의 된 색상을 조사하고 인수로 전달 된 색상에 그들을 비교하는 반사를 사용합니다. 이것은 더 이상 최적화 될 수 있지만 일반적인 기술에 대한 아이디어를 제공해야합니다. 댓글에서 언급 한 바와 같이

private static String GetColorName(Color color) 
{ 
    var predefined = typeof(Color).GetProperties(BindingFlags.Public | BindingFlags.Static); 
    var match = (from p in predefined where ((Color)p.GetValue(null, null)).ToArgb() == color.ToArgb() select (Color)p.GetValue(null, null)); 
    if (match.Any()) 
     return match.First().Name; 
    return String.Empty; 
} 
+0

'Any' 대신에'First' 대신'FirstOrDefault'를 호출하고 결과가 null인지 확인하십시오. –

+2

색상은 구조체입니다. FirstOrDefault는 null이 아닌 빈 색을 반환합니다. –

20

KnownColor 열거이 간단하게 사용할 수 있습니다

Color.FromArgb 당신에게 Color을 줄 것이다

using System; 
using System.Collections.Generic; 
using System.Drawing; 
using System.Linq; 
using System.Reflection; 

class Test 
{ 
    static void Main() 
    { 
     Color color = Color.FromArgb(255, 0, 0); 
     Console.WriteLine(color.Name); // ffff0000 

     var colorLookup = Enum.GetValues(typeof(KnownValue)) 
       .Cast<KnownColor>() 
       .Select(Color.FromKnownColor) 
       .ToLookup(c => c.ToArgb()); 

     // There are some colours with multiple entries... 
     foreach (var namedColor in colorLookup[color.ToArgb()]) 
     { 
      Console.WriteLine(namedColor.Name); 
     } 
    } 
} 

원래 대답을하지만, 절대로 이름을 갖지 않을 것이다. 내가 아는 한 당신은 명명 된 색을 얻기 위해 반사를 사용해야합니다. 여기가 동시에까지 일하고 콜 캠벨의 솔루션의 또 다른 버전의

...

using System; 
using System.Collections.Generic; 
using System.Drawing; 
using System.Linq; 
using System.Reflection; 

class Test 
{ 
    static void Main() 
    { 
     Color color = Color.FromArgb(255, 0, 0); 
     Console.WriteLine(color.Name); // ffff0000 

     var colorLookup = typeof(Color) 
       .GetProperties(BindingFlags.Public | BindingFlags.Static) 
       .Select(f => (Color) f.GetValue(null, null)) 
       .Where(c => c.IsNamedColor) 
       .ToLookup(c => c.ToArgb()); 

     // There are some colours with multiple entries... 
     foreach (var namedColor in colorLookup[color.ToArgb()]) 
     { 
      Console.WriteLine(namedColor.Name); 
     } 
    } 
} 
+0

[KnownColor enumeration] (https://msdn.microsoft.com/en-us/library/system.drawing.knowncolor (v = vs.110) .aspx? cs-lang = csharp # code-snippet -2). –

+0

@AndrewMorton : 좋은 지적 - 편집 됨. –

+0

'KnownColor'는'ActiveCaptionText'와 같은 시스템 색상을 포함하고 있기 때문에이 경우별로 도움이되지 않습니다. 따라서이 메서드는이 이름도 반환합니다. – Karsten

0

빠르고 간단하게 뭔가를 들어,이 (WPF에서) 시도 :

public string GetNameOfColor(Color color) { 
    var colorProperty = typeof(Colors).GetProperties().FirstOrDefault(p => 
     (Color)(p.GetValue(p, null)) == color); 
    return (colorProperty != null) ? colorProperty.Name : color.ToString(); 
} 

Visual Studio 2010에서는 p.GetValue(p, null)이 필요합니다. Visual Studio 2013 이상에서는 p.GetValue(p) 만 사용할 수 있습니다.

이 기술의 장점은, 그 간결 외에, 그것은 System.Drawing 또는 System.Reflection에 대한 참조를 필요로하지 않는다는 것입니다하지만 사용자가 WPF 인 System.Windows 네임 스페이스 내부에 남아 있습니다. System.Windows.Media에 대한 참조가 필요합니다. WPF에서 색상을 사용하는 경우에는 이미 가지고 있어야합니다. 만약 당신이 나를 좋아한다면, 당신은 WPF 어플리케이션에 좋은 필요없이 System.Drawing을 추가하지 않으려 고합니다. 왜 WPF 네임 스페이스 안에 머물러야하는지에 관해서는, 선호도의 문제입니다. 예를 들어 WPF v/s System.Drawing에서 토론을 참조하십시오.

+0

이것은 다른 두 답변과 어떻게 다릅니 까? WPF는 어느 부분입니까? –

관련 문제