समस्या यह है कि setRGB()
एक 0xRRGGBB रंग मान चाहता है। BufferedImage नाटक करना पसंद करता है कि छवि आरजीबी है, कोई फर्क नहीं पड़ता कि डेटा के रूप में क्या संग्रहीत किया जाता है। आप वास्तव में आंतरिक DataBufferShort
(getTile(0, 0).getDataBuffer()
के साथ) पर प्राप्त कर सकते हैं, लेकिन यह पता लगाना मुश्किल हो सकता है कि यह कैसे निर्धारित किया जाता है।
int[] buffer = /* pixels */;
ColorModel model = new ComponentColorModel(
ColorSpace.getInstance(ColorSpace.CS_GRAY), new int[] { 16 },
false, true, Transparency.OPAQUE, DataBuffer.TYPE_USHORT);
Image image = Toolkit.getDefaultToolkit().createImage(
new MemoryImageSource(VERTICAL_PIXELS, HORIZONTAL_PIXELS,
model, buffer, 0, VERTICAL_PIXELS));
इस दृष्टिकोण का लाभ यह है कि आप को नियंत्रित कि:
आप पहले से ही एक short[]
में अपने पिक्सल है, एक सरल समाधान के लिए उन्हें एक MemoryImageSource
में बजाय एक int[]
एक यह जाम में कॉपी करने के लिए हो सकता है अंतर्निहित पिक्सेल सरणी। आप उस सरणी में परिवर्तन कर सकते हैं और पर newPixels()
पर कॉल कर सकते हैं, और यह लाइव अपडेट होगा। यह भी आप ग्रेस्केल से अपनी खुद की अन्य पैलेट परिभाषित करने के लिए पूरा शक्ति देता है:
int[] cmap = new int[65536];
for(int i = 0; i < 65536; ++i) {
cmap[i] = (((i % 10000) * 256/10000) << 16)
| (((i % 20000) * 256/20000) << 8)
| (((i % 40000) * 256/40000) << 0);
}
ColorModel model = new IndexColorModel(16, 65536, cmap, 0, false, -1, DataBuffer.TYPE_USHORT);
यह दृष्टिकोण ठीक काम करता है अगर आप सिर्फ स्क्रीन पर छवि प्रदर्शित करना चाहते हैं:
JFrame frame = new JFrame();
frame.getContentPane().add(new JLabel(new ImageIcon(image)));
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
हालांकि, अगर आप चाहते थे इसे फ़ाइल में लिखने के लिए और एक-शॉर्ट-प्रति-पिक्सेल प्रारूप (कहें, मैटलैब में लोड करने के लिए) को सुरक्षित रखें, फिर आप भाग्य से बाहर हैं। सबसे अच्छा आप इसे BufferedImage
में पेंट करना और ImageIO
से सहेजना है, जो आरजीबी के रूप में सहेज जाएगा।
आप निश्चित रूप से अंत में एक BufferedImage
की जरूरत है, एक और दृष्टिकोण, रंग अपने आप को पैलेट लागू आरजीबी मूल्यों की गणना करने के लिए है, और फिर उन्हें छवि में कॉपी:
short[] data = /* your data */;
int[] cmap = /* as above */;
int[] rgb = new int[data.length];
for(int i = i; i < rgb.length; ++i) {
rgb[i] = cmap[data[i]];
}
BufferedImage image = new BufferedImage(
VERTICAL_PIXELS, HORIZONTAL_PIXELS,
BufferedImage.TYPE_INT_RGB);
image.setRGB(0, 0, VERTICAL_PIXELS, HORIZONTAL_PIXELS,
pixels, 0, VERTICAL_PIXELS);
मैंने किया है कि, तो एहसास हुआ कि मेरी ड्राइंग कोड हर जगह ArrayOutOfBounds अपवादों के साथ FUBAR है। इसे देखकर, ऐसा लगता है कि यह ठीक काम करेगा। मुझे बस इतना करना है कि इसे एक .png के रूप में आउटपुट करें, जिसे मैंने सफलतापूर्वक किया है (उम्मीद है)। मैं इसे सही के रूप में चिह्नित करूंगा क्योंकि ऐसा लगता है कि यह ठीक काम करेगा। –
जब यह छवि में पिक्सेल डालता है, तो क्या यह उन्हें लंबवत रेखाओं में खींचता है जो बाईं ओर से शुरू होता है और शीर्ष पर शुरू होता है और नीचे जाता है? क्योंकि मेरे आंशिक रूप से काम करने वाले कोड में छवि 90 डिग्री घड़ी की दिशा में घूमती है और मुझे नहीं लगता कि यह ड्राइंग की गलती है। –
कभी नहीं!मुझे मेमोरी इमेजसोर्स भाग में 200 को HORIZONTAL_PIXELS में बदलना पड़ा। यह बहुत अच्छा काम करता है, धन्यवाद! –