2011-01-31 7 views
7

私は線グラフの異なる色を生成する:Javaの折れ線グラフで同じ輝度の異なる色を生成する方法は?

  • 私はそれらが同じ輝度(計算されない明るさ)になりたい(人間の目のために)等しく異なる色
  • を生成する

(これはYIQが近いですが、完全に均一ではない輝度を持ち、RGBとHSLを除外する)

を使用すると、均一なカラースキームの生成を処理するために(Javaで)任意のライブラリを使用したことがありますか?

私はすでにこの問題について数日を過ごしていますので、皆さんの中には同じ問題があって解決したいと思っています。

ありがとうございます!

:残念ながら、AppEngine(またはjava.awt.Colorを使用するもの)ではjava.awtパッケージを使用できません。

+0

ラボの色空間を考慮しましたか? – Rekin

+0

はい、有望です。しかし、私はそれにもう少し時間をかけなければならないでしょう。私は解決策を探しているので、このトピックについてもっと時間を費やす必要はありません。 – hakunin

+1

ほとんどの場合、輝度を使用してチャートなどの赤と緑の色合いを区別する、色盲の人にとって使い勝手の悪夢を作り出していることに注意してください。 – ddimitrov

答えて

2

は、ここで私はあなたが輝度Yと色座標x、yの渡しWikipediaのページ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を試す。

例の画像:gamut with Y=0.3

私は、GoogleのApp Engineについては何も知らないが、ARGBの整数は、必要な色指定の一種でありますか?

+0

私はあなたのコードをMirah(Rubyの構文を使用したJava)に書き換えました。結果として、私が渡しても「ff808080」を取得しました。 "0xFF808080"をLong.parseLong( "FF808080"、16)それが問題を引き起こしているのでしょうか? – hakunin

+0

だから私はそれがいくつかの色を出力するように管理しました(あなたは0.3..0.5のスペースで適切でした)が、それほど違いはありません(彼らはすべて黄色です)。 N色のcollor paleteを出力するための使用例を投稿できますか?ありがとう! – hakunin

+0

色域のエッジが台形(更新されたコードを参照)であるため、N色を生成するのは簡単ではありません。 2つの提案があります:標準のJ2SE(またはその他のもの)を使用してRGBカラーの配列を事前に計算するか、HSLを使用しますが、それは適切ではありません。または、RGB空間で多くの色を計算し、それらをコレクションに入れ、輝度でソートし、コレクションからサイズNのスライスを取ってください(私はあなたが望むならこのコードを投稿できます) –

関連する問題