2010-02-18 8 views
13

में पीएनजी कनवर्ट करना मुझे एक साधारण पीएनजी को जेपीईजी प्रारूप में परिवर्तित करने में समस्याएं आ रही हैं। मैं निम्नलिखित कोड का उपयोग कर रहा:जेपीईजी

...

File png = new File(filePath); 
    try { 
     SeekableStream s = new FileSeekableStream(png); 
     PNGDecodeParam pngParams = new PNGDecodeParam(); 
     ImageDecoder dec = ImageCodec.createImageDecoder("png", s, pngParams); 
     RenderedImage pngImage = dec.decodeAsRenderedImage(); 
     JPEGEncodeParam jparam = new JPEGEncodeParam(); 
     jparam.setQuality(0.50f); // e.g. 0.25f 
     File jpeg = new File("jpeg.jpeg"); 
     FileOutputStream out = new FileOutputStream(jpeg); 

     ImageEncoder encoder = ImageCodec.createImageEncoder("JPEG", out, jparam); 

     encoder.encode(pngImage); 

     s.close(); 

    } catch (IOException e) { 
     ok = false; 
     e.printStackTrace(); 
    } 

    return ok; 
} 

...

मैं एक जय अपवाद के साथ खत्म -> java.lang.RuntimeException: केवल 1, या 3-बैंड बाइट डेटा लिखा जा सकता है। com.sun.media.jai.codecimpl.JPEGImageEncoder.encode (JPEGImageEncoder.java:148) पर ...

विकल्पों में से बाहर निकलें। कोई उपाय?

उत्तर

18

आप शायद png आप के लिए प्रयास करने से पहले से छुटकारा पाने की जरूरत है कि में अल्फा चैनल है जेपीजी लिखें।

एक नया BufferedImage टाइप करें TYPE_INT_RGB (TYPE_INT_ARGB नहीं) के साथ, और फिर अपनी खाली छवि पर अपनी स्रोत छवि (pngImage) लिखें।

कुछ इस तरह (चेतावनी, नहीं परीक्षण किया कोड):

BufferedImage newImage = new BufferedImage(pngImage.getWidth(), pngImage.getHeight(), BufferedImage.TYPE_INT_RGB); 
newImage.createGraphics().drawImage(pngImage, 0, 0, Color.BLACK, null); 
+0

सुरुचिपूर्ण समाधान। यह मेरे लिए पूरी तरह से काम किया। – Norberto

19

ImageIO का उपयोग BufferedImage में पीएनजी पढ़ने और जेपीईजी प्रारूप में छवि को लिखने के लिए आसान हो सकता है।

परिशिष्ट: इस तरीके से, रूपांतरण पारदर्शी रूप से लेखक के ImageTranscoder द्वारा नियंत्रित किया जाता।

BufferedImage img = ImageIO.read(new File("image.png")); 
ImageIO.write(img, "jpg", new File("image.jpg")); 
+0

मुझे लगता है कि आपका समाधान उपरोक्त सुझाए गए जैसा ही है। यह भी काम करता है। – Norberto

+1

'छविIO' का पढ़ने/लिखने का रूपांतरण निहित है; ट्रेवर हैरिसन के उदाहरण में रूपांतरण जानकारीपूर्ण रूप से स्पष्ट है। – trashgod

+0

+1 बहुत अच्छी तकनीक – stacker

3

मैं suppse कि जय एक अनुक्रमित रंग मॉडल के साथ PNG छवि पढ़ता है और केवल जेपीईजी फ़ाइलें के रूप में 8 बिट ग्रेस्केल या 24-बिट रंग छवियों लिखने में सक्षम है।

आप इस कार्य के लिए जय का उपयोग करने की आवश्यकता नहीं है, तो आप के बजाय ImageIO उपयोग करने के लिए सक्षम होना चाहिए:

ImageIO.write(ImageIO.read(new File("in.png")), "JPEG", new File("out.jpg")); 
+0

मैंने पहले यह कोशिश की है और यह काम नहीं करता है। – Norberto

+0

+1 @ नॉरबर्टो: क्या आप विस्तारित कर सकते हैं? करीब देखकर, यह वही है जो मैंने पहले उपयोग किया था। – trashgod

+0

उपरोक्त कार्यान्वयन अपेक्षा के अनुसार प्रदर्शन नहीं करता है। मैं यह नहीं कह रहा हूं कि यह बिल्कुल काम नहीं करता है। मेरे मामले में (जिन छवियों के साथ मैं काम कर रहा हूं) यह काम नहीं करता है। अपेक्षित फ़ाइल बनाने में विफल रहता है और आउटपुट एक झूठा मान है। स्पष्ट रूप से यह जेपीईजी के लिए कोई उपयुक्त लेखक नहीं मिल सकता है। मुझे यह अजीब लगता है लेकिन मेरे पास यह पता लगाने का कोई समय नहीं है कि यह वास्तव में क्यों काम नहीं कर रहा है। मैं भविष्य में नजदीक दिखने जा रहा हूं लेकिन पता है कि मैं क्या काम करता हूं। – Norberto

3

मैंने यह भी पाया कि ImageIO (जावा 6) के साथ एक BufferedImage में एक PNG छवि को पढ़ने और यह एक जेपीजी "प्रारूप का नाम" के लिए लिख बाहर छवि दूषित छवि वहां थी, लेकिन रंगों को "सौरकृत" और लगभग उलटा देखा गया। जेपीजी फ़ाइल निश्चित रूप से पीएनजी फ़ाइल से बहुत छोटी थी, इसलिए बहुत सारे संपीड़न किए गए थे। मैं नहीं देखता कि आप संपीड़न या रंग गहराई को कैसे नियंत्रित कर सकते हैं।

+0

मुझे एक ही समस्या थी ... बहुत परेशान, डीबग करने के लिए मुश्किल। यह ओएसएक्स पर है। – jhegedus

1

मुझे निम्न संदेश को थोड़ा अलग संदर्भ में मिल रहा था। अल्फा चैनल से छुटकारा पाने से समस्या हल हो गई

javax.imageio.IIOException: Sample size must be <= 8 
    at com.sun.imageio.plugins.jpeg.JPEGImageWriter.write(JPEGImageWriter.java:435) 
    at javax.imageio.ImageWriter.write(ImageWriter.java:580) 
    at com.twelvemonkeys.imageio.plugins.jpeg.JPEGImageWriter.write(Unknown Source) 
    at net.sf.basedb.util.ImageTools.tiffToJpg(ImageTools.java:98) 
    at net.sf.basedb.util.ImageTools.main(ImageTools.java:118)