您好,我想知道 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/