java - 如何使用Java压缩PNG图像

标签 java compression png

您好,我想知道 Java 中是否有任何方法可以减小作为 BufferedImage 加载并将保存为 PNG 的图像的大小(使用任何类型的压缩)。

也许是某种 png imagewriteparam?我没有发现任何有用的东西,所以我卡住了。

这是一个如何加载和保存图像的示例

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

最佳答案

通过调用 ImageIO.write,您可以使用 png 的默认压缩质量。您可以选择显式压缩模式,从而大大减小文件大小。

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

关于java - 如何使用Java压缩PNG图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2721303/

相关文章:

java - Neo4j 并行读取和批量插入

ffmpeg - 不支持压缩的 SWF 格式/cws2fws 问题

用于更快加载图像的 iOS Swift 技巧

java - 为什么当我在 main 方法中实现 lambda 表达式时,编译器不说接口(interface)已实现?

java - 安装更新 SSL 证书会破坏 Java Web 集成吗?

compression - 如何计算tar.gz文件中的文件数(不解压缩)?

java - JAVA中的ESRI几何压缩算法

JavaScript数组到PNG? - 客户端

charts - 如何通过弹出另存为窗口将 kendo ui dataviz 图表导出为 (.png) 或 (.jpg) 图像格式?

java - 限制 Java 中 println() 语句的字符数