как сжать изображение PNG с помощью Java - PullRequest
14 голосов
/ 27 апреля 2010

Здравствуйте, я хотел бы знать, есть ли в 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));
}

Ответы [ 4 ]

3 голосов
/ 27 апреля 2010

Если it's going to be saved as PNG, сжатие будет выполнено на этом этапе. PNG имеет алгоритм сжатия без потерь (в основном прогнозирование с последующим сжатием lempel-ziv) с несколькими настраиваемыми параметрами (типы " filters ") и незначительным влиянием на величину сжатия - в целом, по умолчанию будет оптимальным. 1004 *

2 голосов
/ 14 января 2013

Вы можете попробовать pngtastic . Это чистый java png оптимизатор изображений, который может сжимать изображения до некоторой степени.

1 голос
/ 27 апреля 2010

Посмотрите на класс ImageWriterParam в той же упаковке, что и класс ImageIO. Упоминается сжатие.

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

Также посмотрите на пример на http://exampledepot.com/egs/javax.imageio/JpegWrite.html и посмотрите, хорошо ли он подходит для файлов PNG.

0 голосов
/ 29 января 2019

При вызове 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();
}

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