简体   繁体   English

如何使用Java压缩PNG图像

[英]how to compress a PNG image using Java

Hi I would like to know if there is any way in Java to reduce the size of an image (use any kind of compression) that was loaded as a BufferedImage and is going to be saved as an PNG. 嗨,我想知道Java中是否有任何方法可以减少作为BufferedImage加载的图像大小(使用任何类型的压缩),并将保存为PNG。

Maybe some sort of png imagewriteparam? 也许是某种png imagewriteparam? I didnt find anything helpful so im stuck. 我没有找到任何有用的东西,所以我卡住了。

heres a sample how the image is loaded and saved 下面是一个示例如何加载和保存图像

public static BufferedImage load(String imageUrl) {         
    Image image = new ImageIcon(imageUrl).getImage();
    bufferedImage = new BufferedImage(image.getWidth(null),
                                                    image.getHeight(null),
                                                    BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2D = bufferedImage.createGraphics();
    g2D.drawImage(image, 0, 0, null);
    return bufferedImage;
}

public static void storeImageAsPng(BufferedImage image, String imageUrl) throws IOException {
    ImageIO.write(image, "png", new File(imageUrl));
}

If it's going to be saved as PNG , compression will be done at that stage. 如果it's going to be saved as PNG ,则将在该阶段进行压缩。 PNG has a lossless compression algorithm (basically prediction followed by lempel-ziv compression) with few adjustable parameters (types of " filters ") and not much impact in compression amount - in general the default will be optimal. PNG具有无损压缩算法(基本上是预测,然后是lempel-ziv压缩),具有很少的可调参数(“ 滤波器 ”类型)并且对压缩量没有太大影响 - 通常默认值是最佳的。

You may want to try pngtastic . 你可能想尝试pngtastic It's a pure java png image optimizer that can shrink may png images down to some degree. 这是一个纯粹的java png图像优化器,可以缩小到某种程度的png图像。

Have a look at the ImageWriterParam class in the same package as the ImageIO class. 在与ImageIO类相同的包中查看ImageWriterParam类。 It mentions compression. 它提到了压缩。

https://docs.oracle.com/javase/7/docs/api/javax/imageio/ImageWriteParam.html https://docs.oracle.com/javase/7/docs/api/javax/imageio/ImageWriteParam.html

Also look at the example at http://exampledepot.com/egs/javax.imageio/JpegWrite.html and see if it translates well for PNG files. 另请参阅http://exampledepot.com/egs/javax.imageio/JpegWrite.html上的示例,看看它是否可以很好地转换为PNG文件。

By calling ImageIO.write you use the default compression quality for pngs. 通过调用ImageIO.write您可以使用png的默认压缩质量。 You can choose an explicit compression mode which reduces file size a lot. 您可以选择显式压缩模式,以减少文件大小。

String inputPath = "a.png";
String outputPath = "b.png";

BufferedImage image;
IIOMetadata metadata;

try (ImageInputStream in = ImageIO.createImageInputStream(Files.newInputStream(Paths.get(inputPath)))) {
    ImageReader reader = ImageIO.getImageReadersByFormatName("png").next();
    reader.setInput(in, true, false);
    image = reader.read(0);
    metadata = reader.getImageMetadata(0);
    reader.dispose();
}

try (ImageOutputStream out = ImageIO.createImageOutputStream(Files.newOutputStream(Paths.get(outputPath)))) {
    ImageTypeSpecifier type = ImageTypeSpecifier.createFromRenderedImage(image);
    ImageWriter writer = ImageIO.getImageWriters(type, "png").next();

    ImageWriteParam param = writer.getDefaultWriteParam();
    if (param.canWriteCompressed()) {
        param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
        param.setCompressionQuality(0.0f);
    }

    writer.setOutput(out);
    writer.write(null, new IIOImage(image, null, metadata), param);
    writer.dispose();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM