2011-01-31 5 views
7

मैं अपने लाइन रेखांकन के लिए अलग अलग रंग उत्पन्न करना चाहते हैं:जावा में लाइन चार्ट के लिए समान चमक के विभिन्न रंग कैसे उत्पन्न करें?

  • मैं (मानव आँख के लिए) समान रूप से अलग अलग रंग
  • मैं उन्हें एक ही चमक होना चाहता हूँ (गणना नहीं चमक)
उत्पन्न करना चाहते हैं

(इस आरजीबी और एचएसएल बाहर शासन करता है, YIQ करीब है लेकिन है नहीं पूरी तरह से वर्दी luminance)

आप वर्दी रंग योजना पीढ़ी को संभालने के लिए (जावा में) किसी भी लाइब्रेरी इस्तेमाल किया है?

मैं पहले से ही इस मुद्दे पर कुछ दिनों के खर्च किया है, इसलिए मैं आप में से कुछ एक ही समस्या थी और इसे हल उम्मीद कर रहा हूँ।

धन्यवाद!

संपादित करें: दुर्भाग्यवश, मैं ऐपइंजिन (या जावा.एट.कॉलर का उपयोग करने वाले किसी भी चीज़) पर जावा.एट पैकेज का उपयोग नहीं कर सकता।

+0

आप प्रयोगशाला रंग अंतरिक्ष विचार किया है? – Rekin

+0

हां, यह आशाजनक लग रहा है। लेकिन मुझे उस पर कुछ और समय बिताना होगा। मैं एक समाधान की तलाश में हूं, इसलिए मुझे इस विषय पर अधिक दिन बिताना नहीं है। – hakunin

+1

ध्यान रखें कि आप कलर-अंधे लोगों के लिए उपयोगिता दुःस्वप्न पैदा कर रहे हैं, जो चार्ट में लाल-हरे रंग के रंगों के बीच अंतर करने के लिए अधिकतर ल्यूमिनेंस का उपयोग करते हैं। – ddimitrov

उत्तर

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 और रंग निर्देशांक एक्स, वाई में पास में देखने से अभी-अभी लिखा है। एक्स और वाई नाममात्र 0..1 से हैं। लेकिन उस 'स्पेस' में से बहुत कुछ एसआरबीबी गैमट में नहीं है, इसलिए एक प्रदर्शित रंग के अनुरूप नहीं है। वाई भी 0..1 है, शुरुआत में 0.3..0.5 आज़माएं।

उदाहरण चित्र: gamut with Y=0.3

मैं गूगल एप इंजन बारे में कुछ पता नहीं है, लेकिन एक ARGB पूर्णांक रंग विनिर्देश की बिल्कुल सही है?

+0

मैं आपके कोड को मिराह (रूबी के सिंटैक्स के साथ जावा) में दोबारा लिखता हूं और परिणामस्वरूप मुझे 'ff808080' मिलता है, इससे कोई फर्क नहीं पड़ता कि मुझे क्या गुजरता है। मुझे "0xFF808080" को Long.parseLong ("FF808080", 16) के साथ बदलना था <- क्या समस्या हो सकती है? – hakunin

+0

इसलिए मैंने इसे कुछ रंगों को आउटपुट करने में कामयाब रहे (आप 0.3..0.5 स्पेस के साथ सही थे) लेकिन वे बहुत अलग नहीं हैं (वे सभी पीले-आश हैं)। क्या आप एन रंगों के कॉलर पैलेट को आउटपुट करने के लिए एक उदाहरण उपयोग पोस्ट कर सकते हैं? धन्यवाद! – hakunin

+0

हम्म, आसान नहीं एन रंग उत्पन्न करने के लिए क्योंकि सरगम ​​के किनारों एक समलम्ब हैं (अद्यतन कोड देखें)। मेरे पास 2 और सुझाव हैं: या तो मानक जे 2 एसई (या कुछ और) का उपयोग करके आरजीबी रंगों की एक सरणी की गणना करें, मैं एचएसएल का उपयोग करूंगा लेकिन आप जो उपयुक्त नहीं थे, सुनिश्चित नहीं है कि क्यों। या, आरजीबी स्पेस में बहुत सारे रंगों की गणना करें और उन्हें एक संग्रह में रखें, ल्यूमिनेंस द्वारा क्रमबद्ध करें और संग्रह से आकार एन का एक टुकड़ा लें (यदि आप चाहें तो मैं इसके लिए कोड पोस्ट कर सकता हूं) –

संबंधित मुद्दे