2011-01-31 26 views
7

Benim çizgi grafikler için farklı renkler oluşturmak istiyorum:Java'daki çizgi grafik için aynı parlaklıktaki farklı renkler nasıl oluşturulur?

  • I (insan gözü için) eşit olarak farklı renkler onları aynı parlaklık olmak istiyorum
  • (bilgisayarlı değil parlaklık)
oluşturmak istiyorum

(bu, RGB ve HSL dışladı YIQ değil mükemmel homojen bir parlaklık yakındır ama vardır)

Eğer tekdüze renk şeması nesil işlemek için (Java) herhangi kütüphaneleri kullandınız mı?

Bu konu hakkında birkaç günümü çoktan harcadım, bu yüzden bazılarınızın aynı soruna sahip olduğunu ve çözdüğünü umuyorum.

Teşekkürler!

Düzenle: Ne yazık ki, java.awt paketlerini AppEngine (veya java.awt.Color kullanan bir şey) üzerinde kullanamıyorum.

+0

Laboratuvar renk alanı olarak gördünüz mü? – Rekin

+0

Evet, umut verici görünüyor. Ama bunun için biraz daha zaman harcamak zorundayım. Bir çözüm arıyorum, bu yüzden bu konu hakkında daha fazla gün harcamak zorunda değilim. – hakunin

+1

Grafiklerde kırmızı-yeşil tonları birbirinden ayırt etmek için çoğunlukla parlaklık kullanan renk körlü insanlar için kullanılabilirlik kabusu yarattığınızı unutmayın. – ddimitrov

cevap

2

İşte Bir parlaklık Y ve renk koordinatları x, y geçmek Vikipedi sayfa 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; 
} 

bakarak sadece şimdi yazdığım küçük fonksiyon. x ve y, nominal olarak 0..1'dir, ancak bu 'boşluk' un bir kısmı sRGB gamutunda bulunmaz, bu nedenle görüntülenebilir bir renge karşılık gelmez. Y de 0..1, başlangıçta 0.3.0.0.5 deneyin.

örnek bir resim: google app motor hakkında hiçbir şey bilmiyorum ama ARGB tamsayı ihtiyacınız renk şartname türüdür gamut with Y=0.3

?

+0

Kodunuzu Mirah'a (ruby'nin sözdizimi ile java) tekrar yazdım ve ne olursa olsun sonuç olarak 'ff808080' aldım. Long.parseLong ("FF808080", 16) ile "0xFF808080" değerini değiştirmek zorundaydım <- Bu soruna neden olabilir mi? – hakunin

+0

Bu yüzden bazı renkler çıkarmayı başardım (bu 0.3..0.5 boşlukta haklıydınız) ama çok farklı değiller (hepsi sarı-ish). N renklerinden oluşan bir collor palete çıktı için örnek bir kullanım yayınlayabilir misiniz? Teşekkürler! – hakunin

+0

Hmm, N renklerinin üretilmesi kolay değildir, çünkü gamın kenarları bir yamuktur (güncellenmiş koda bakınız). 2 tane öneri daha var: ya önceden J2SE (ya da başka bir şey) kullanan bir RGB renkleri dizisini önceden hesapladım, HSL kullanaydım, ama bu uygun değildi, neden olmasın. VEYA, RGB uzayında bir çok renk hesaplayın ve bunları bir koleksiyona koyun, parlaklığa göre sıralayın ve koleksiyondan N boyutuna bir dilim ayırın (isterseniz bunu kod yazabilirim) –

İlgili konular