2012-10-25 18 views
13

मैं पढ़ने और लिखने के लिए छवियों ImageIO.read() और ImageIO.write() javax.imageio.ImageIO में तरीकों का उपयोग कर दिया गया है, और मैंने पाया कि कुछ छवियों का रंग अजीब रूप से बदल जाता है।jpeg छवि रंग काफी के बाद बदल जाती है सिर्फ ImageIO.read() और ImageIO.write()

यहां तक ​​कि अगर मैं कुछ भी नहीं करना है, लेकिन बस छवियों पढ़ सकते हैं और उन्हें लिखना (JPEG, PNG, GIF के साथ) मेरी कोड बदलने के लिए, उन सभी नए चित्र एक ही मुद्दा है।

मैं ImageIO.read/write तरीकों के बाद से पहले किसी अन्य कोड जोड़ने के लिए/की ज़रूरत है?

File f = new File("obw.jpg"); 
    BufferedImage bi = ImageIO.read(f); 
    FileOutputStream fos2 = new FileOutputStream("obw2.jpg"); 
    ImageIO.write(bi, "JPG", fos2); 
    FileOutputStream fos3 = new FileOutputStream("obw3.gif"); 
    ImageIO.write(bi, "GIF", fos3); 
    FileOutputStream fos4 = new FileOutputStream("obw4.png"); 
    ImageIO.write(bi, "PNG", fos4); 

मेरे पर्यावरण:

java version "1.6.0_35" 
    MacOSX 10.8.2 

मूल छवि: enter image description here

छवियों के बाद पढ़ने और लिखने में से एक:

enter image description here

यहाँ कोड मैं प्रयोग किया जाता है

+0

कौन सा बदल जाता है, या उन सभी को? मूल छवि शायद * भ्रष्ट * है? –

+0

http://stackoverflow.com/questions/2408613/problem-reading-jpeg-image-using-imageio-readfile-file – Lesto

+0

मैं मूल छवि पढ़ सकते हैं और jpeg, png, gif छवियों और तीन के सभी ने लिखा है कि हरी obiwan दिखाने ... क्या कोई तरीका है कि मैं जांच सकता हूं कि क्या मूल छवि दूषित है? – UGO

उत्तर

22

आपकी समस्या यह है कि ImageIO आपके जेपीईजी में आरबीजी डेटा के रूप में वाईसीबीसीआर डेटा को गलत व्याख्या कर रहा है। प्रासंगिक जावा बग 4712797 और 4776576 हैं, जो ओरेकल गलत तरीके से जावा 1.4 में तय किए गए थे, लेकिन वास्तव में अभी भी कुछ जावा 5, 6, और 7 जेवीएम को पीड़ित हैं।

एक प्रोजेक्ट में मैं काम करता हूं, हमने यह देखने के लिए विशेष रूप से निर्मित test JPEG with a single black pixel लोड करके इस समस्या का सामना किया है यह देखने के लिए कि क्या छवियां इसे ठीक से लोड करती हैं। यदि पिक्सेल हरा आता है, तो ImageIO छवि डेटा को गलत व्याख्या कर रहा है, इसलिए जब हम बाद में जेपीईजी लोड करते हैं और हम जेपीईजी के प्रकार का पता लगाते हैं जो समस्या का कारण बनता है, तो हम रंग सुधार भी लागू करते हैं। (जेपीईजी की तरह जो जेवीएम में समस्या को ट्रिगर करती है, जो इसे प्रदर्शित करती है, इसमें एक विशेष प्रकार का सबमप्लिंग और कोई जेएफआईएफ मार्कर नहीं है।)

यहां कुछ LGPLv2-licensed code समस्या से संबंधित हैं। इस तरह के कोड की आवश्यकता लगभग दर्जन वर्षीय बग्स के आसपास काम करने के लिए होती है जब पूरी दुनिया पूरी तरह से जेपीईजी लोड करने में कामयाब होती है, क्योंकि मैं चाहता हूं कि जावा आग में मर जाए।

+0

धन्यवाद नहीं है देता है !! मैं अब ज्यादा सुरक्षित महसूस कर रहा हूँ !! – UGO

+0

@UGO आप इस समस्या को कैसे हल करते हैं? –

+4

अभी भी तय नहीं है - मैं जावा 8 पर यह समस्या देख रहा हूं। –

2

एक रंगस्थान समस्या प्रतीत होता है, छविियो छवि के कुछ एन्कोडिंग/डिकोडिंग करने का प्रयास करता है लेकिन ऐसा लगता है। यहां एक नज़र डालें: Unable to read JPEG image using ImageIO.read(File file)