Сжать размер изображения с помощью Java - PullRequest
1 голос
/ 09 января 2020

Я хочу сжать (уменьшить) размер изображения, используя Java. Мы можем загружать изображения в форматах jpg / jpeg / png. Общий формат изображений - PNG. Итак, после загрузки изображения на сервер нам нужно сжать (уменьшить размер файла) и преобразовать его в PNG.

У меня есть следующий код для сжатого изображения:

    BufferedImage bufferedImage = ImageIO.read(inputStream);
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

    switch (imageType) {
        case PNG:
        case JPG:
            // need Java 9+ for PNG writer support
            ImageWriter writer = ImageIO.getImageWritersByFormatName(imageType.getExtension()).next();
            ImageOutputStream ios = ImageIO.createImageOutputStream(outputStream);
            writer.setOutput(ios);

            ImageWriteParam param = writer.getDefaultWriteParam();
            if (param.canWriteCompressed()) {
                param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
                param.setCompressionQuality(0.3f);
            }

            writer.write(null, new IIOImage(bufferedImage, null, null), param);
            writer.dispose();
            return new ByteArrayInputStream(outputStream.toByteArray());
        default:
            log.warn("Image type unknown");
            return null;
    }

проблема в том - после обработки изображения я получил результат - размер файла увеличился, а не уменьшился. Исходное изображение имеет меньший размер, чем сжатое. Любые предложения о том, как решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 10 января 2020

В качестве решения этой проблемы я могу порекомендовать API TinyPNG.
Вы можете использовать его как для сжатия, так и для изменения размера изображения.

Работает как для .jpeg, так и для .png.

Документация: tinypng.com / developers / reference / java

1 голос
/ 09 января 2020

К сожалению, сжатие JPEG с потерями сжимается намного лучше, чем сжатие PNG без потерь. Вы можете ограничить ширину и высоту изображения и пропорционально масштабировать.

Поэтому я бы переключился на JPEG и ограничил размер.

...