2011-01-31 95 views
7

我想產生不同的顏色我折線圖:如何在Java中爲折線圖生成相同亮度的不同顏色?

  • 我要產生同樣的不同顏色(人眼)
  • 我想他們是相同的亮度(不計算亮度)

(這就排除了RGB和HSL,YIQ是接近,但還沒有完全均勻的亮度)

你有沒有使用(在Java中)的庫來處理統一的顏色方案生成?

我已經在這個問題上花了幾天時間,所以我希望你們中的一些人有同樣的問題並解決它。

謝謝!

編輯:不幸的是,我不能在AppEngine(或任何使用java.awt.Color)上使用java.awt包。

+0

您是否考慮過實驗室顏色空間? – Rekin 2011-01-31 09:18:00

+0

是的,它看起來很有希望。但我不得不花更多的時間。我正在尋找解決方案,因此我不必在這個主題上花費更多的時間。 – hakunin 2011-01-31 09:21:45

回答

2

這裏有一個小功能,我寫了剛纔從看維基百科頁面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; 
} 

你傳入一個亮度Y和顏色座標x,y。 x和y的名義上是從0到1,但很多「空間」不在sRGB色域中,因此不對應可顯示的顏色。 Y也是0..1,最初嘗試0.3..0.5。

一個例子形象:gamut with Y=0.3

我不知道谷歌應用程序引擎什麼,但一個是ARGB整數你需要的那種顏色規格的?

相關問題