JAVA

2010-03-03 15 views
5

में BufferedImage में रंगों को प्रतिस्थापित करने के लिए कैसे मैं सोच रहा हूं कि BufferedImage में रंग बदलने के लिए एक और अधिक कुशल विधि है या नहीं। फिलहाल मैं निम्न विधि का उपयोग करता हूं:JAVA

मैं प्रतिस्थापित करने के लिए रंगों के साथ एक सरणी भरता हूं और रंगों को पारदर्शिता समेत बदलने के लिए भरता हूं। फिर मैं छवि में हर पिक्सेल के माध्यम से लूप। यदि यह सरणी में से किसी एक रंग से मेल खाता है तो मैं इसे सरणी से नए रंग के साथ बदल देता हूं। यहां कोड है:

Graphics2D g2; 
    g2 = img.createGraphics(); 
    int x, y, i,clr,red,green,blue; 

    for (x = 0; x < img.getWidth(); x++) { 
    for (y = 0; y < img.getHeight(); y++) { 

     // For each pixel in the image 
     // get the red, green and blue value 
     clr = img.getRGB(x, y); 
     red = (clr & 0x00ff0000) >> 16; 
     green = (clr & 0x0000ff00) >> 8; 
     blue = clr & 0x000000ff; 

     for (i = 1; i <= Arraycounter; i++) { 
     // for each entry in the array 
     // if the red, green and blue values of the pixels match the values in the array 
     // replace the pixels color with the new color from the array 
     if (red == Red[i] && green == Green[i] && blue == Blue[i]) 
     { 
      g2.setComposite(Transparency[i]); 
      g2.setColor(NewColor[i]); 
      g2.fillRect(x, y, 1, 1); 
     } 
     } 
    } 

जिन छवियों के साथ मैं काम कर रहा हूं वे छोटे, 20x20 पिक्सल या इससे भी कम हैं। फिर भी ऐसा लगता है कि ऐसा करने के लिए एक और अधिक प्रभावी तरीका होना चाहिए।

+0

शायद यदि आप मूल समस्या की व्याख्या करते हैं तो हम – medopal

+0

में सहायता कर सकते हैं कोड को मानचित्र में एक किंवदंती के रूप में उपयोग करने के लिए छवियां बनाती हैं। हमारे पास चार रंगों के साथ टेम्पलेट छवियों का एक सेट है। काला, लाल, हरा और नीला। मानचित्र में विषयगत प्रतिनिधित्व के आधार पर टेम्पलेट छवियों को सही रंग मिलना चाहिए। काला पृष्ठभूमि रंग में परिवर्तित हो जाएगा, सही सीमा रंग लाल, हरा एक हैश पैटर्न और नीले क्षेत्र पारदर्शी हो जाएगा। – Rene

उत्तर

10

छवि पिक्सेल के मान को बदलने के बजाय आप अंतर्निहित ColorModel को संशोधित कर सकते हैं। इस तरह से बहुत तेज और पूरी छवि पर फिर से शुरू करने की कोई आवश्यकता नहीं है, इसलिए यह अच्छी तरह से स्केल करता है।

+1

'जावामैप' जावा एपीआई में एक वर्ग नहीं है। उसे ऐसा कैसे करना चाहिए? – uckelman

+2

Thats एक टाइपो था (जिसे पहले से ही तय कर दिया गया था), नीचे मतदान थोड़ा कठोर लगता है – objects

+0

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

3

HashMap<Color,Color> का उपयोग करें। कुंजी मूल रंग होना चाहिए, और मूल्य प्रतिस्थापन होना चाहिए। अगर रिटर्न शून्य हो जाता है, तो कुछ भी नहीं करें।

3

ऐसा लगता है कि ऐसा करने का बेवकूफ तरीका LookupOp लागू करना है और फिर नया ऑपरेशन BufferedImage बनाने के लिए इस ऑपरेशन को लागू करें। here का एक अच्छा जवाब है।

+0

मुझे लाल, हरे, नीले और काले पिक्सेल को अपने नए रंग में बदलने के लिए क्या करना है। क्या यह LookupOp का उपयोग करके किया जा सकता है? ऐसा लगता है कि प्रत्येक रंग घटक पर व्यक्तिगत रूप से काम करता है। – Rene

+0

मैंने इसका उपयोग नहीं किया है, लेकिन मुझे यकीन है कि यह कर सकता है। उत्तर में देखकर मैं संदर्भ देता हूं कि यह लुकअपटेबल (2 डी सरणी के साथ निर्मित) का उपयोग गंतव्य रंगों के स्रोत को मैप करने के लिए किया जाता है। लुकअपटेबल की लुकअप पिक्सेल विधि देखें ... मुझे काफी यकीन है कि यह क्या कहा जाएगा, आम तौर पर आरजीबीए मान वाले 4-तत्व स्रोत सरणी के साथ (आपको यह जांचना चाहिए)। – Adamski

1

निर्माता/उपभोक्ता/पर्यवेक्षक प्रतिमान में अपनी छवि को फ़िल्टर करने के लिए BufferedImageFilter/BufferedImageOp पर एक नज़र डालें।