Java 将PNG转换为JPEG
我在将简单的PNG转换为JPEG格式时遇到问题。 我正在使用以下代码: 我最终得到了一个JAI异常-> java.lang.RuntimeException:只能写入1或3段字节数据。 在com.sun.media.jai.codecimpl.JPEGImageEncoder.encode(JPEGImageEncoder.java:148)上 别无选择。有什么建议吗 将PNG读入图像并以JPEG格式写出图像可能更容易使用 附录:在这种方法中,转换是由作者的团队透明地处理的Java 将PNG转换为JPEG,java,image,png,jpeg,jai,Java,Image,Png,Jpeg,Jai,我在将简单的PNG转换为JPEG格式时遇到问题。 我正在使用以下代码: 我最终得到了一个JAI异常-> java.lang.RuntimeException:只能写入1或3段字节数据。 在com.sun.media.jai.codecimpl.JPEGImageEncoder.encode(JPEGImageEncoder.java:148)上 别无选择。有什么建议吗 将PNG读入图像并以JPEG格式写出图像可能更容易使用 附录:在这种方法中,转换是由作者的团队透明地处理的 我支持JAI使用
我支持JAI使用索引颜色模型读取PNG图像,并且只能将8位灰度或24位彩色图像作为JPEG文件写入 如果此任务不要求您使用JAI,您应该可以使用ImageIO:
ImageIO.write(ImageIO.read(new File("in.png")), "JPEG", new File("out.jpg"));
在编写jpg之前,您可能需要去掉png中的alpha通道 创建类型为_INT_RGB(不是类型为_INT_ARGB)的新缓冲区映像,然后将源映像(pngImage)写入新的空白映像 类似这样的内容(警告,未测试代码):
我还发现,使用ImageIO(Java6)将PNG图像读入BuffereImage并将其写入JPG“格式名称”会损坏图像。图像在那里,但颜色看起来“日晒”,几乎是颠倒的。JPG文件肯定比PNG文件小得多,因此进行了大量压缩。我不知道如何控制压缩或颜色深度。我在一个稍微不同的上下文中得到了以下信息。摆脱阿尔法通道解决了这个问题
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)
javax.imageio.IIOException:样本大小必须参见
看一看用harmanjd发布的图形环境重画的解决方案。使用DirectColorModel的解决方案无法编译,应该删除。我没有足够的代表点直接在那里发表评论 使用其他解决方案转换后,我的文件已损坏,但此方法对我有效:
public static void formatConverter(String pngFile, String jpgFile) {
try {
File input = new File(pngFile);
File output = new File(jpgFile);
BufferedImage image = ImageIO.read(input);
BufferedImage result = new BufferedImage(
image.getWidth(),
image.getHeight(),
BufferedImage.TYPE_INT_RGB);
result.createGraphics().drawImage(image, 0, 0, Color.WHITE, null);
ImageIO.write(result, "jpg", output);
} catch (IOException e) {
e.printStackTrace();
}
}
我想你的解决方案和上面建议的是一样的。它也可以工作。ImageIO
的读/写转换是隐式的;Trevor Harrison例子中的转换是信息明确的。这个解决方案不可能适用于所有PNG。请参阅:。如果链接中断,要点是使用ImageIO转换的带有alpha的PNG将使用通常不支持的有效颜色空间写入JPEG。引用一句话:“希望能够以JPEG格式写入/读取包含alpha通道的图像的开发人员可以使用图像I/O API,但需要注意的是,许多本地应用程序并不完全符合YCbCrA和RGBA格式。”本地应用程序在这里意味着所有浏览器。+1@Norberto:你能详细说明一下吗?仔细看,这与我以前使用的类似。上面的实现没有按预期执行。我并不是说这根本不起作用。在我的情况下(我正在处理的图像),这不起作用。无法创建所需的文件,输出为假值。显然,它找不到任何适合JPEG的编写器。我觉得这很奇怪,但我没有时间去弄清楚它到底为什么不起作用。我将在将来进行更仔细的研究,但为了知道我一直在使用的是.ImageIO.write(ImageIO.read(新文件(“in.png”),“jpg”,新文件(“out.jpg”);他正在工作。谢谢,我也有同样的问题。。。很烦人,很难调试。在OSX上。
BufferedImage newImage = new BufferedImage( pngImage.getWidth(), pngImage.getHeight(), BufferedImage.TYPE_INT_RGB);
newImage.createGraphics().drawImage( pngImage, 0, 0, Color.BLACK, null);
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)
public static void formatConverter(String pngFile, String jpgFile) {
try {
File input = new File(pngFile);
File output = new File(jpgFile);
BufferedImage image = ImageIO.read(input);
BufferedImage result = new BufferedImage(
image.getWidth(),
image.getHeight(),
BufferedImage.TYPE_INT_RGB);
result.createGraphics().drawImage(image, 0, 0, Color.WHITE, null);
ImageIO.write(result, "jpg", output);
} catch (IOException e) {
e.printStackTrace();
}
}