Как сжать изображение PNG с помощью Java
Привет. Я хотел бы знать, есть ли какой-либо способ в Java, чтобы уменьшить размер изображения (использовать любой вид сжатия), который был загружен как BufferedImage и будет сохранен как PNG.
Может быть, какой-то png imagewriteparam? Я не нашел ничего полезного, поэтому я застрял.
heres образец того, как изображение загружено и сохранено
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));
}
Ответы
Ответ 1
Если it going to be saved as PNG
, сжатие будет выполнено на этом этапе. PNG имеет алгоритм сжатия без потерь (в основном, предсказание с последующим сжатием lempel-ziv) с несколькими настраиваемыми параметрами (типы filters") и не очень влияние на степень сжатия - в целом значение по умолчанию будет оптимальным.
Ответ 2
Вы можете попробовать pngtastic. Это чистый оптимизатор изображений java png, который может сжиматься, может в некоторой степени уменьшать изображения.
Ответ 3
Посмотрите на класс ImageWriterParam
в том же пакете, что и класс ImageIO
. Он упоминает сжатие.
https://docs.oracle.com/javase/7/docs/api/javax/imageio/ImageWriteParam.html
Также посмотрите на http://exampledepot.com/egs/javax.imageio/JpegWrite.html и посмотрите, хорошо ли это переводит для файлов PNG.
Ответ 4
ImageIO.write
вы используете качество сжатия по умолчанию для pngs. Вы можете выбрать явный режим сжатия, который значительно уменьшает размер файла.
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();
}
ImageTypeSpecifier type = ImageTypeSpecifier.createFromRenderedImage(image);
ImageWriter writer = ImageIO.getImageWriters(type, "png").next();
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(0.0f);
try (ImageOutputStream out = ImageIO.createImageOutputStream(Files.newOutputStream(Paths.get(outputPath)))) {
writer.setOutput(out);
writer.write(null, new IIOImage(image, null, metadata), param);
writer.dispose();
}