2010-06-08 10 views
20

हम Java2D उपयोग कर रहे हैं हमारी वेबसाइट पर अपलोड की गई तस्वीरों आकार बदलने के लिए है, लेकिन हम एक मुद्दा (एक मालूम होता है एक पुरानी, ​​सीएफ .: http://forums.sun.com/thread.jspa?threadID=5425569) में चलाने - कुछ विशेष JPEGs उठाना एक CMMException जब हम ImageIO.read() करने के लिए अपने बाइनरी डेटा युक्त एक InputStream कोशिश :क्या JPEG फ़ाइलों को पढ़ने के लिए ImageIO के लिए 100% जावा विकल्प है?

java.awt.color.CMMException: Invalid image format 
at sun.awt.color.CMM.checkStatus(CMM.java:131) 
at sun.awt.color.ICC_Transform.<init>(ICC_Transform.java:89) 
at java.awt.image.ColorConvertOp.filter(ColorConvertOp.java:516) 
at com.sun.imageio.plugins.jpeg.JPEGImageReader.acceptPixels(JPEGImageReader.java:1114) 
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readImage(Native Method) 
at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java:1082) 
at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java:897) 
at javax.imageio.ImageIO.read(ImageIO.java:1422) 
at javax.imageio.ImageIO.read(ImageIO.java:1326) 
    ... 

हम इसे विशिष्ट कैमरे पर ली गई तस्वीरों को संकुचित (स्टैक ट्रेस, जो हमारे ImageIO.read() कॉल, सर्वलेट कोड और इस तरह है के शेष कतरना), और मैं एक तस्वीर है कि ट्रिगर चयनित यह त्रुटि: http://img214.imageshack.us/img214/5121/estacaosp.jpg। हमने देखा है कि यह केवल सूर्य के जेवीएम (लिनक्स और मैक पर, इसे 1.6.0_20 पर परीक्षण किया गया है) के साथ होता है - ओपनजेडीके के साथ एक टेस्ट मशीन जेपीईजी रीडर के एक अलग कार्यान्वयन के कारण संभवतः एक ही तस्वीर के बिना एक ही तस्वीर पढ़ती है।

दुर्भाग्यवश, हम उत्पादन में JVMs को स्विच करने में असमर्थ हैं, न ही देशी-निर्भर समाधान जैसे ImageMagick (http://www.imagemagick.org/) का उपयोग करने में असमर्थ हैं।

यह ध्यान में रखते हुए, मेरा प्रश्न है: क्या छवियों के लिए एक प्रतिस्थापन जेपीईजी रीडर है जो लिंक किए गए एक जैसी तस्वीरों को संभाल सकता है? यदि नहीं, तो क्या कोई और 100% शुद्ध जावा फोटो आकार बदलने का समाधान है जिसका हम उपयोग कर सकते हैं?

धन्यवाद!

+0

वैसे, मुझे पता है कि ImageIO सीएमवाईके छवियों को संसाधित नहीं करता है (http://stackoverflow.com/questions/2408613/problem-reading-jpeg-image-using-imageio-readfile-file के अनुसार)।लेकिन नमूना एक आरजीबी है (जहां तक ​​मैक पूर्वावलोकन का संबंध है, अगर कोई इसकी पुष्टि कर सकता है तो खुशी होगी) – chesterbr

+0

मैंने ओरेकल/सन बग डेटाबेस पर एक बग खोला: http://bugs.sun.com/bugdatabase /view_bug.do?bug_id=7064516 यदि आप अभी भी फ़िक्स में रूचि रखते हैं तो इसके लिए वोट दें! –

उत्तर

11

एक संभवतः उपयोगी पुस्तकालय के लिए आप कर सकते थे जावा उन्नत इमेजिंग लाइब्रेरी (JAI)

इस पुस्तकालय का उपयोग करना काफ़ी ImageIO का उपयोग करने से, लेकिन एक त्वरित परीक्षण में और अधिक जटिल मैं सिर्फ भाग गया यह किया जा सकता है हो सकता है खुला और प्रदर्शन आपके द्वारा लिंक की गई समस्या छवि फ़ाइल।

public static void main(String[] args) { 
     RenderedImage image = JAI.create("fileload", "estacaosp.jpg"); 

     float scale=(float) 0.5; 

     ParameterBlock pb = new ParameterBlock(); 
     pb.addSource(image); 

     pb.add(scale); 
     pb.add(scale); 
     pb.add(1.0F); 
     pb.add(1.0F); 

     pb.add(new InterpolationNearest());// ;InterpolationBilinear()); 
     image = JAI.create("scale", pb); 

     // Create an instance of DisplayJAI. 
     DisplayJAI srcdj = new DisplayJAI(image); 

     JScrollPane srcScrollPaneImage = new JScrollPane(srcdj); 

// Use a label to display the image 
     JFrame frame = new JFrame(); 

     frame.getContentPane().add(srcScrollPaneImage, BorderLayout.CENTER); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

इस कोड को चलाने के बाद छवि ठीक लोड लगती है।

String filename2 = new String ("tofile.jpg"); 
    String format = new String ("JPEG"); 
    RenderedOp op = JAI.create ("filestore", image, filename2, format); 

मुझे आशा है कि यह तुम बाहर में मदद करता है: यह तो 50% ParamaterBlock

और अंत में अगर आप फ़ाइल सहेजना चाहते हैं तो आप सिर्फ कॉल कर सकते हैं का उपयोग करके आकार दिया जाता है। शुभकामनाएँ।

+0

यह निश्चित रूप से करता है! यह जांचना होगा कि यह "हेडलेस" सेटअप पर कितना अच्छा काम करेगा, लेकिन मेरा मानना ​​है कि हम इसे काम कर सकते हैं। धन्यवाद! – chesterbr

+1

बस आपको बताने के लिए, हमारे डेवलपर्स ने इस समाधान को लागू किया, और यह एक आकर्षण की तरह काम किया। फिर से धन्यवाद! – chesterbr

+1

मृत लिंक, कृपया http://www.oracle.com/technetwork/java/current-142188.html या जो भी हो, के साथ अपडेट करें। – user1133275

7

मुझे एक ही समस्या का सामना करना पड़ा। मैं जेएआई का उपयोग करने के लिए अनिच्छुक था क्योंकि यह पुराना है लेकिन ऐसा लगता है कि यह सबसे छोटा समाधान है।

इस कोड, एक BufferedImage के लिए एक InputStream धर्मान्तरित सूरज की ImageIO (तेज) या कुछ मामलों में जहां यह समस्या हो, जय का उपयोग करने में उपयोग करते हुए:

public static BufferedImage read(InputStream is) throws IOException { 
    try { 
     // We try it with ImageIO 
     return ImageIO.read(ImageIO.createImageInputStream(is)); 
    } catch (CMMException ex) { 
     // If we failed... 
     // We reset the inputStream (start from the beginning) 
     is.reset(); 
     // And use JAI 
     return JAI.create("stream", SeekableStream.wrapInputStream(is, true)).getAsBufferedImage(); 
    } 
} 
8

पुरानी पोस्ट है, लेकिन भविष्य में संदर्भ के लिए:

यहां मिले इस प्रश्न और लिंक से प्रेरित, मैंने इमेजियो के लिए एक जेपीईजी इमेज रीडर प्लगइन लिखा है जो इस तरह के "खराब" आईसीसी रंग प्रोफाइल के साथ जेपीईजी छवियों का समर्थन करता है ("मुद्दा" आईसीसी प्रोफाइल में प्रतिपादन उद्देश्य जावा के साथ असंगत है ColorConvertOp)। यह सादा जावा है और जेए की आवश्यकता नहीं है।

स्रोत कोड और लिंक किए गए बाइनरी बिल्ड TwelveMonkeys project से गिटहब पर स्वतंत्र रूप से उपलब्ध हैं।

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