簡體   English   中英

如何使用Java壓縮PNG圖像

[英]how to compress a PNG image using Java

嗨,我想知道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));
}

如果it's going to be saved as PNG ,則將在該階段進行壓縮。 PNG具有無損壓縮算法(基本上是預測,然后是lempel-ziv壓縮),具有很少的可調參數(“ 濾波器 ”類型)並且對壓縮量沒有太大影響 - 通常默認值是最佳的。

你可能想嘗試pngtastic 這是一個純粹的java png圖像優化器,可以縮小到某種程度的png圖像。

在與ImageIO類相同的包中查看ImageWriterParam類。 它提到了壓縮。

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

另請參閱http://exampledepot.com/egs/javax.imageio/JpegWrite.html上的示例,看看它是否可以很好地轉換為PNG文件。

通過調用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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM