2014-02-23 1 views
0

현재 응용 프로그램에서 작업 중이며 제공되는 색상 (보완, 분할 상보, 유사, 삼중, 사각, 사각형 등)을 찾으려고합니다. 기본 색상. 색상 하모니 이론 및 알고리즘, 보완법, 삼중 항, 사변형 등

내가 지금 뭐하는 거지 :

  1. 변환 RGB 색상을 HSV
  2. 변환을 360도 휠 주위에 색상을 얻을 수있는 H 값을 조정 (S 및 V 값은 그대로입니다)

    : HSV 다시 RGB로 여기

는 트라이어드 대한 예시 (HSV 객체가 기본 색상을 나타낸다)을 인

colors.Add(new HSVData() { h = hsv.h + 90, s = hsv.s, v = hsv.v }); 
colors.Add(new HSVData() { h = hsv.h + 180, s = hsv.s, v = hsv.v }); 
colors.Add(new HSVData() { h = hsv.h + 270, s = hsv.s, v = hsv.v }); 

RGB HSV에 :

public static HSVData RGBtoHSV(RGBResult RGB) 
{ 
    double min; 
    double max; 
    double delta; 

    double r = (double)RGB.r/255; 
    double g = (double)RGB.g/255; 
    double b = (double)RGB.b/255; 

    double h; 
    double s; 
    double v; 

    min = Math.Min(Math.Min(r, g), b); 
    max = Math.Max(Math.Max(r, g), b); 
    v = max; 
    delta = max - min; 
    if (max == 0 || delta == 0) 
    { 
     s = 0; 
     h = 0; 
    } 
    else 
    { 
     s = delta/max; 
     if (r == max) 
     { 
      // Between Yellow and Magenta 
      h = (g - b)/delta; 
     } 
     else if (g == max) 
     { 
      // Between Cyan and Yellow 
      h = 2 + (b - r)/delta; 
     } 
     else 
     { 
      // Between Magenta and Cyan 
      h = 4 + (r - g)/delta; 
     } 
    } 

    h *= 60; 
    if (h < 0) 
    { 
     h += 360; 
    } 

    return new HSVData() 
    { 
     h = (int)(h/360 * 255), 
     s = (int)(s * 255), 
     v = (int)(v * 255) 
    }; 
} 

HSV RGB로 : 나는 점점 오전

public static Color ConvertHsvToRgb(float h, float s, float v) 
{ 
    byte MAX = 255; 

    h = h/360; 
    if (s > 0) 
    { 
     if (h >= 1) 
      h = 0; 
     h = 6 * h; 
     int hueFloor = (int)Math.Floor(h); 
     byte a = (byte)Math.Round(MAX * v * (1.0 - s)); 
     byte b = (byte)Math.Round(MAX * v * (1.0 - (s * (h - hueFloor)))); 
     byte c = (byte)Math.Round(MAX * v * (1.0 - (s * (1.0 - (h - hueFloor))))); 
     byte d = (byte)Math.Round(MAX * v); 

     switch (hueFloor) 
     { 
      case 0: return Color.FromArgb(MAX, d, c, a); 
      case 1: return Color.FromArgb(MAX, b, d, a); 
      case 2: return Color.FromArgb(MAX, a, d, c); 
      case 3: return Color.FromArgb(MAX, a, b, d); 
      case 4: return Color.FromArgb(MAX, c, a, d); 
      case 5: return Color.FromArgb(MAX, d, a, b); 
      default: return Color.FromArgb(0, 0, 0, 0); 
     } 
    } 
    else 
    { 
     byte d = (byte)(v * MAX); 
     return Color.FromArgb(255, d, d, d); 
    } 
} 

색상이 많은 온라인 색상 도구에 따라 잘못

그리고 광장에 대한 1,399,113,210 ! HSV를 사용해야합니까? 내가 도대체 ​​뭘 잘못하고있는 겁니까? 에 비해

온라인 도구 : 사전에

http://colorschemedesigner.com/

http://www.colorsontheweb.com/colorwizard.asp

감사합니다!

+0

변환 루틴을 RGB에서 HSV 및 HSV에서 RGB로 표시하십시오. 그리고 그들이 어떻게 잘못되었는지 말해주십시오. 예상 출력과 함께 예제 입력 및 실제 출력을 보여줍니다. –

+0

답장을 보내 주셔서 감사합니다. 원래 게시물을 편집했습니다. – JPSavard

답변

2

ConvertHsvToRgb 메서드에서 예상되는 값 범위는 무엇입니까? 이처럼 그것은 나에게 보이는 :이 메소드를 호출하는 방법을

0 <= h <= 360 
0 <= s <= 1.0 
0 <= v <= 1.0 

당신은 표시되지 않습니다,하지만 당신은이 범위에서 값을 전달하지 않는 경우, 올바른 변환을받지 않습니다. 트라이어드에서와 마찬가지로 색조를 뺄 계획이라면 색조를 0 - 360으로 표준화하는 방법을 포함하고 싶을 것입니다.

나는 h, s, v 값을 정수로 변환하지 말아야한다는 것을 제외하고는 귀하의 전환이 정확하다고 생각합니다. 위에 표시된 범위에서 두 배로 유지하십시오.

public static HSVData RGBtoHSV(Color RGB) 
{ 
    double r = (double)RGB.R/255; 
    double g = (double)RGB.G/255; 
    double b = (double)RGB.B/255; 

    double h; 
    double s; 
    double v; 

    double min = Math.Min(Math.Min(r, g), b); 
    double max = Math.Max(Math.Max(r, g), b); 
    v = max; 
    double delta = max - min; 
    if (max == 0 || delta == 0) 
    { 
     s = 0; 
     h = 0; 
    } 
    else 
    { 
     s = delta/max; 
     if (r == max) 
     { 
      // Between Yellow and Magenta 
      h = (g - b)/delta; 
     } 
     else if (g == max) 
     { 
      // Between Cyan and Yellow 
      h = 2 + (b - r)/delta; 
     } 
     else 
     { 
      // Between Magenta and Cyan 
      h = 4 + (r - g)/delta; 
     } 

    } 

    h *= 60; 
    if (h < 0) 
    { 
     h += 360; 
    } 

    return new HSVData() 
    { 
     h = h, 
     s = s, 
     v = v 
    }; 
} 

이제이 h, s, v 값을 ConvertHsvToRgb 메소드에 전달할 수 있습니다. 인수를 변경하여 채도 및 값 입력의 유효성을 확인하고 색조를 표준화했습니다.

public static Color ConvertHsvToRgb(double h, double s, double v) 
{ 
    Debug.Assert(0.0 <= s && s <= 1.0); 
    Debug.Assert(0.0 <= v && v <= 1.0); 

    // normalize the hue: 
    while (h < 0) 
     h += 360; 
    while (h > 360) 
     h -= 360; 

    h = h/360; 

    byte MAX = 255; 

    if (s > 0) 
    { 
     if (h >= 1) 
      h = 0; 
     h = 6 * h; 
     int hueFloor = (int)Math.Floor(h); 
     byte a = (byte)Math.Round(MAX * v * (1.0 - s)); 
     byte b = (byte)Math.Round(MAX * v * (1.0 - (s * (h - hueFloor)))); 
     byte c = (byte)Math.Round(MAX * v * (1.0 - (s * (1.0 - (h - hueFloor))))); 
     byte d = (byte)Math.Round(MAX * v); 

     switch (hueFloor) 
     { 
      case 0: return Color.FromArgb(MAX, d, c, a); 
      case 1: return Color.FromArgb(MAX, b, d, a); 
      case 2: return Color.FromArgb(MAX, a, d, c); 
      case 3: return Color.FromArgb(MAX, a, b, d); 
      case 4: return Color.FromArgb(MAX, c, a, d); 
      case 5: return Color.FromArgb(MAX, d, a, b); 
      default: return Color.FromArgb(0, 0, 0, 0); 
     } 
    } 
    else 
    { 
     byte d = (byte)(v * MAX); 
     return Color.FromArgb(255, d, d, d); 
    } 
} 

내 테스트를 토대로이 두 가지 방법은 RGB에서 HSV까지 모든 색상에 대해 "왕복"전환을 제공합니다.

"트라이어드"의 경우 원래 색상에서 +/- 120도 조정됩니다. 예를 들어, 기본 색상으로 빨간색으로 시작하면 +/- 120도 색상은 녹색과 파란색입니다.이러한 전환이 올바르게 작동하는 것으로 보입니다.

+0

감사합니다. 드디어 hsv => rgb 변환에 문제가 있음을 발견했습니다. 그러나 이제는 내가 선택한 어떤 색이라도 내 트라이어드, 사중, 보체에서 항상 빨간색, 녹색, 파란색 또는 노란색을 나타낼 것입니다. – JPSavard

+0

귀하의 전환 방법에 위의 편집 내용을 참조하십시오 - 나는 그들이 당신에게 정확한 전환을 줄 것이라고 믿습니다. – Doug

+0

첫 번째 (빨간색)는 RGB에서 HSV로 변환하고 다시 RGB로 전환하고 다시 빨간색으로 끝나는 것을 보여줍니다 (YellowGreen과 동일). 녹색과 파란색의 경우 빨강을 +/- 120 도로 이동하고 RGB로 다시 변환하면 예상대로 녹색과 파란색이됩니다. 색상 변환이 더 쉽기 때문에 RGB로 다시 변환했습니다. 하지만 예, HSV (120, 1, 1)는 녹색 RGB (0, 255, 0)입니다. – Doug