代码之家  ›  专栏  ›  技术社区  ›  Norberto

将PNG转换为JPEG

  •  13
  • Norberto  · 技术社区  · 16 年前

    我在将简单的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异常-> runtimeexception:只能写入1或3波段字节数据。 在COM.Sun.Media.jay.CODECOMPIL.JPEGIMAGECODER .EnCODE(JPEGIMAGECODER,JAVA:148)…

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

    5 回复  |  直到 10 年前
        1
  •  19
  •   Trevor Harrison    16 年前

    在编写jpg之前,可能需要去掉png中的alpha通道。

    创建一个新的bufferedimage,类型为_int_rgb(不是_int_argb),然后将源映像(pngimage)写入新的空白映像。

    类似这样的内容(警告,未测试代码):

    BufferedImage newImage = new BufferedImage( pngImage.getWidth(), pngImage.getHeight(), BufferedImage.TYPE_INT_RGB);
    newImage.createGraphics().drawImage( pngImage, 0, 0, Color.BLACK, null);
    
        2
  •  23
  •   trashgod    16 年前

    可能更容易使用 ImageIO 将png读入 BufferedImage 并以jpeg格式写出图像。

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

    BufferedImage img = ImageIO.read(new File("image.png"));
    ImageIO.write(img, "jpg", new File("image.jpg"));
    
        3
  •  4
  •   sb4    13 年前

    我还发现,用IMAIO(Java 6)将PNG图像读入缓冲区并将其写入JPG“格式名称”会损坏图像。图像在那里,但颜色看起来“日光化”和几乎颠倒。jpg文件肯定比png文件小得多,所以进行了大量压缩。我不知道你如何控制压缩或颜色深度。

        4
  •  3
  •   jarnbjo    16 年前

    我支持jai读取带有索引颜色模型的png图像,并且只能将8位灰度或24位彩色图像作为jpeg文件写入。

    如果此任务不需要使用jai,则应该可以使用imageio:

    ImageIO.write(ImageIO.read(new File("in.png")), "JPEG", new File("out.jpg"));
    
        5
  •  1
  •   dwaring    10 年前

    我在一个稍微不同的上下文中得到了下面的消息。摆脱阿尔法通道解决了这个问题

    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)
    
    推荐文章