2010-02-18 172 views
13

我在將簡單的PNG轉換爲JPEG格式時遇到了問題。 我使用下面的代碼:將PNG轉換爲JPEG

...

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; 
} 

...

我結束了一個JAI例外 - > 了java.lang.RuntimeException:只有1個,或可以寫入3段字節數據。 at com.sun.media.jai.codecimpl.JPEGImageEncoder.encode(JPEGImageEncoder.java:148)...

Ran out of options。任何建議?

回答

18

你可能在你需要嘗試之前擺脫PNG alpha通道寫jpg。

創建一個類型爲TYPE_INT_RGB(不是TYPE_INT_ARGB)的新BufferedImage,然後將源圖像(pngImage)寫入新的空白圖像。

像這樣的東西(警告,沒有經過測試的代碼):

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

優雅的解決方案。它對我來說非常合適。 – Norberto 2010-02-22 11:43:53

19

使用ImageIO可能更容易將PNG讀取到BufferedImage中,並將圖像以JPEG格式寫出。

附錄:在此方法中,轉換由作者的ImageTranscoder透明處理。

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

我想你的解決方案是與上面建議的相同。它也可以。 – Norberto 2010-02-22 11:45:21

+1

'ImageIO'的讀/寫轉換是隱含的;特雷弗哈里森的例子中的轉換信息明確。 – trashgod 2010-02-22 12:55:13

+0

+1挺酷的技巧 – stacker 2010-02-25 21:09:17

3

我suppse是JAI與索引顏色模型讀取PNG圖像,並且只能夠寫8位灰度或24位彩色圖像爲JPEG文件。

如果你不使用JAI這個任務所需要的,你應該能夠使用的ImageIO來代替:

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

我以前試過這個,它不起作用。 – Norberto 2010-02-22 11:43:11

+0

+1 @Norberto:你能詳細說明一下嗎?仔細觀察,這與我之前使用過的類似。 – trashgod 2010-02-26 01:50:00

+0

上述實現不能按預期執行。我並不是暗示這根本不起作用。在我的情況下(我正在使用的圖像)這不起作用。無法創建預期的文件,輸出是錯誤的值。顯然,它找不到任何合適的JPEG作家。我覺得這很奇怪,但我沒有時間去弄清楚爲什麼它不起作用。我將在未來更仔細地看看,但要知道我遵守的是什麼。 – Norberto 2010-03-01 11:34:54

3

我還發現,讀取PNG圖像與ImageIO的(Java 6中)一個BufferedImage,寫出來的JPG「格式名稱」損壞了圖像。圖像在那裏,但顏色看起來「日曬」,幾乎倒過來。 JPG文件確實比PNG文件小得多,因此完成了大量的壓縮。我看不出你如何控制壓縮或顏色深度。

+0

我有同樣的問題...很煩人,很難調試。它在OSX上。 – jhegedus 2017-03-22 01:03:57

1

我在略有不同的上下文中收到以下消息。擺脫alpha通道解決了這個問題

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)