2011-01-31 9 views
7

는 내 선 그래프에 다른 색상을 생성 할 :Java에서 선형 차트에 대해 동일한 휘도의 다른 색상을 생성하는 방법은 무엇입니까?

  • 하는 I은 (육안) 동일 색상 차이 I 그들이 동일한 휘도로 할
  • (계산하지 휘도)
를 생성 할

(이은, RGB 및 HSL을 배제 YIQ하지 완벽하게 균일 한 휘도 가까운 그러나이)

하면 균일 한 색상 생성을 처리하기 (자바) 어떤 라이브러리를 사용 했습니까?

나는이 문제에 대해 이미 며칠을 보냈는데, 여러분 중 일부는 동일한 문제를 가지고 해결하기를 희망합니다.

감사합니다!

: 불행히도 AppEngine (또는 java.awt.Color를 사용하는 모든 패키지)에서는 java.awt 패키지를 사용할 수 없습니다.

+0

실험실 색상 공간을 고려 했습니까? – Rekin

+0

예, 유망 해 보입니다. 그러나 나는 그것에 더 많은 시간을 할애해야 할 것입니다. 솔루션을 찾고 있으므로이 주제에 대해 더 많은 시간을 할애 할 필요가 없습니다. – hakunin

+1

차트에서 빨간색과 녹색 음영을 구분하기 위해 대부분 루미넌스를 사용하는 색맹 인 사람들에게 유용성 악몽을 불러 일으키고 있음을 명심하십시오. – ddimitrov

답변

2

는 여기에 당신은 휘도 Y와 색 좌표 X, Y에 전달하는 위키 백과 페이지 http://en.wikipedia.org/wiki/SRGB_color_space

private int makeARGB(double Y, double x, double y) { 
    // Out of gamut colour 
    int rgb = 0xFF808080; 
    double X = Y * x/y; 
    double Z = Y * (1 - x - y)/y; 
    double rlin = +3.2046 * X + -1.5372 * Y + -0.4986 * Z; 
    double r = gamma(rlin); 
    int ir = (int) (r * 255.0); 
    if (ir >= 0 && ir < 256) { 
    double glin = -0.9689 * X + +1.8758 * Y + +0.0415 * Z; 
    double g = gamma(glin); 
    int ig = (int) (g * 255.0); 
    if (ig >= 0 && ig < 256) { 
     double blin = +0.0557 * X + -0.2040 * Y + +1.0570 * Z; 
     double b = gamma(blin); 
     int ib = (int) (b * 255.0); 
     if (ib >= 0 && ib < 256) { 
     rgb = 0xFF000000 + (ir << 16) + (ig << 8) + (ib << 0); 
     } 
    } 
    } 
    return rgb; 
} 
private double gamma(double l) { 
    if (l < 0.0031308) { 
    return l * 12.92; 
    } else { 
    return 1.055 * Math.pow(l, 1.0/2.4) - 0.055; 
    } 
} 
private BufferedImage createImage() { 
    BufferedImage bm = new BufferedImage(256, 256, BufferedImage.TYPE_INT_ARGB); 
    for (int ix = 0; ix < bm.getWidth(); ++ix) { 
     double astar = ((double) ix)/((double) bm.getWidth()); 
     for (int iy = 1; iy < bm.getHeight(); ++iy) { 
      double bstar = ((double) iy)/((double) bm.getHeight()); 
      int rgb = makeARGB(0.3, astar, bstar); 
      bm.setRGB(ix, iy, rgb); 
     } 

    } 
    return bm; 
} 

보고에서 지금 막 쓴 작은 기능입니다. x와 y는 일반적으로 0..1입니다. 그러나 '공간'은 sRGB 영역에 없기 때문에 표시 가능한 색상과 일치하지 않습니다. Y도 0..1입니다. 처음에는 0.3..0.5를 시도하십시오.

예 이미지 : 내가 구글 애플 리케이션 엔진에 대해 아무것도 몰라하지만, ARGB 정수는 당신이 필요로하는 색상 사양의 종류 gamut with Y=0.3

?

+0

나는 코드를 Mirah (Ruby의 구문을 사용하는 java)에 다시 작성 했으므로 결과에 상관없이 내가 통과 한 것과 상관없이 'ff808080'을 가져옵니다. "0xFF808080"을 Long.parseLong ("FF808080", 16) 그게 문제를 일으키는 원인이 될 수 있습니까? – hakunin

+0

그래서 나는 몇 가지 색상을 출력하도록 만들었지 만 (당신은 그 0.3..0.5 공간에서 옳았습니다) 그러나 그들은별로 다르지 않았습니다 (그들은 모두 황색입니다). N 색상의 collor palete를 출력하는 예제 사용을 게시 할 수 있습니까? 감사! – hakunin

+0

흠. gamut의 가장자리가 사다리꼴이기 때문에 N 색상을 생성하기 쉽지 않습니다 (업데이트 된 코드 참조). 2 가지 제안 사항이 있습니다. 표준 J2SE (또는 다른 것)를 사용하여 RGB 색상 배열을 사전 계산하거나 HSL을 사용 하겠지만 그 이유는 확실하지 않습니다. 또는 RGB 공간에서 많은 색상을 계산하고 컬렉션에 넣고 휘도별로 정렬하고 컬렉션에서 크기 N의 조각을 가져옵니다 (원하는 경우 코드를 게시 할 수 있습니다) –