将PNG转换为JPEG

问题描述 投票:13回答:6

我在将简单的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)...

没有选择权。有什么建议吗?

java image png jpeg jai
6个回答
19
投票

您可能在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);

24
投票

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

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

BufferedImage

4
投票

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

如果不需要使用JAI来完成此任务,则应该可以改用ImageIO:

ImageTranscoder

4
投票

[我还发现,使用ImageIO(Java 6)将PNG图像读入BufferedImage并将其写出为JPG“格式名称”会损坏图像。图像在那里,但是颜色看上去“很明显”并且几乎​​被反转了。 JPG文件肯定比PNG文件小得多,因此进行了很多压缩。我看不到您如何控制压缩或颜色深度。


1
投票

我在稍微不同的上下文中收到以下消息。摆脱Alpha通道解决了问题

ImageTranscoder

1
投票

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

查看使用harmanjd发布的图形环境重新绘制的解决方案。 DirectColorModel的解决方案无法编译,应该删除掉。我的代表点不足,无法直接在此处发表评论。

© www.soinside.com 2019 - 2024. All rights reserved.