将 PNG 转换为 JPEG

2022-09-02 22:52:32

我在将简单的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波段字节数据。at com.sun.media.jai.codecimpl.JPEGImageEncoder.encode(JPEGImageEncoder.java:148) ...

选项用完了。有什么建议吗?


答案 1

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

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

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

答案 2

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

推荐