Java 将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使用

我在将简单的PNG转换为JPEG格式时遇到问题。 我正在使用以下代码:

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

别无选择。有什么建议吗

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

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


我支持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();
        }

    }