将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); // eg 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; } 

我最终得到了一个JAIexception – > java.lang.RuntimeException:只能写入1或3波段字节数据。 在com.sun.media.jai.codecimpl.JPEGImageEncoder.encode(JPEGImageEncoder.java:148)…

跑出选项。 有什么建议吗?

在尝试编写jpg之前,你可能需要在png中使用alpha通道。

创建一个类型为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); 

使用ImageIO将PNG读入BufferedImage并以JPEG格式写出图像可能更容易。

附录:在这种方法中,转换由作者的ImageTranscoder透明地处理。

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

我还发现使用ImageIO(Java 6)将PNG图像读入BufferedImage并将其写入JPG“格式名称”会损坏图像。 图像在那里,但颜色看起来“曝光”,几乎倒置。 JPG文件肯定比PNG文件小得多,因此进行了大量压缩。 我看不出你如何控制压缩或颜色深度。

我认为JAI使用索引颜色模型读取PNG图像,并且只能将8位灰度或24位彩色图像写为JPEG文件。

如果您不需要使用JAI执行此任务,则应该能够使用ImageIO:

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

我在稍微不同的上下文中收到以下消息。 摆脱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)