我在将简单的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字节的字节数据。在com.sun.media.jai.codecimpl.JPEGImageEncoder.encode(JPEGImageEncoder.java:148)...
没有选择权。有什么建议吗?
您可能在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);
[我还发现,使用ImageIO(Java 6)将PNG图像读入BufferedImage并将其写出为JPG“格式名称”会损坏图像。图像在那里,但是颜色看上去“很明显”并且几乎被反转了。 JPG文件肯定比PNG文件小得多,因此进行了很多压缩。我看不到您如何控制压缩或颜色深度。
我在稍微不同的上下文中收到以下消息。摆脱Alpha通道解决了问题
ImageTranscoder
请参见BufferedImage img = ImageIO.read(new File("image.png"));
ImageIO.write(img, "jpg", new File("image.jpg"));
查看使用harmanjd发布的图形环境重新绘制的解决方案。 DirectColorModel的解决方案无法编译,应该删除掉。我的代表点不足,无法直接在此处发表评论。