17

我在将简单的 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: Only 1, or 3-band byte data may be written。在 com.sun.media.jai.codecimpl.JPEGImageEncoder.encode(JPEGImageEncoder.java:148) ...

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

4

7 回答 7

27

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

附录:在这种方法中,转换由作者的ImageTranscoder.

BufferedImage img = ImageIO.read(new File("image.png"));
ImageIO.write(img, "jpg", new File("image.jpg"));
于 2010-02-18T16:50:08.230 回答
22

你可能在 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);
于 2010-02-18T16:51:51.517 回答
6

我还发现使用 ImageIO (Java 6) 将 PNG 图像读入 BufferedImage 并将其写入 JPG“格式名称”会损坏图像。图像在那里,但颜色看起来“日光化”并且几乎​​颠倒了。JPG 文件肯定比 PNG 文件小得多,因此进行了大量压缩。我看不出您如何控制压缩或颜色深度。

于 2013-03-26T22:40:12.247 回答
5

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

如果您不需要为此任务使用 JAI,您应该能够使用 ImageIO 代替:

ImageIO.write(ImageIO.read(new File("in.png")), "JPEG", new File("out.jpg"));
于 2010-02-18T16:50:56.857 回答
5

用其他解决方案转换后,我的文件损坏了,但这种方法对我有用:

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

    }
于 2020-03-13T21:18:58.390 回答
2

请参阅使用 java 将透明 gif / png 转换为 jpeg

看看harmanjd 发布的使用图形环境重绘的解决方案。使用 DirectColorModel 的解决方案无法编译,应将其清除。我没有足够的代表点直接在那里发表评论。

于 2020-02-26T19:38:57.663 回答
2

我在略有不同的上下文中收到以下消息。摆脱 alpha 通道解决了这个问题

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)
于 2015-10-27T15:24:46.373 回答