it-swarm.com.ru

Как я могу сжать изображения с помощью Java?

Со страницы скорости я получаю только ссылку на изображение и возможную оптимизацию в байтах и ​​процентах, как, Сжатие и изменение размера https://example.com/…ts/xyz.jpg?036861 может сэкономить 212 КБ (сокращение на 51%) . Сжатие https://example.com/…xyz.png?303584508 может сэкономить 4,4 КБ (сокращение на 21%).

Для примера у меня есть изображение размером 300 КБ, и для этого изображения скорость страницы показывает 100 КБ и 30% сокращения.

Это только для одного изображения, но я уверен, что у меня будет много изображений для сжатия . так как я могу сжать изображение, передавая байты или процент в качестве параметра или используя любые другие вычисления в Java (с помощью API или инструмента обработки изображений), чтобы я мог получить сжатую версию изображения, как предложено Google.

Заранее спасибо.

6
Darshit Patel

Вы можете использовать Java ImageIO package для сжатия многих форматов изображений, вот пример

import Java.awt.image.BufferedImage;
import Java.io.*;
import Java.util.Iterator;
import javax.imageio.*;
import javax.imageio.stream.*;

public class Compresssion {

  public static void main(String[] args) throws IOException {

    File input = new File("original_image.jpg");
    BufferedImage image = ImageIO.read(input);

    File compressedImageFile = new File("compressed_image.jpg");
    OutputStream os = new FileOutputStream(compressedImageFile);

    Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg");
    ImageWriter writer = (ImageWriter) writers.next();

    ImageOutputStream ios = ImageIO.createImageOutputStream(os);
    writer.setOutput(ios);

    ImageWriteParam param = writer.getDefaultWriteParam();

    param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
    param.setCompressionQuality(0.05f);  // Change the quality value you prefer
    writer.write(null, new IIOImage(image, null, null), param);

    os.close();
    ios.close();
    writer.dispose();
  }
}

Вы можете найти более подробную информацию об этом здесь

Также есть некоторые сторонние инструменты, подобные этим

EDIT: Если вы хотите использовать Google PageSpeed в своем приложении, он доступен в качестве модуля веб-сервера для Apache или Nginx, вы можете найти здесь, как настроить его для вашего сайта здесь

https://developers.google.com/speed/pagespeed/module/

Но если вы хотите интегрировать библиотеку PageSpeed C++ в свое приложение, вы можете найти инструкции по ее сборке здесь.

https://developers.google.com/speed/pagespeed/psol

Здесь также есть Java-клиент

https://developers.google.com/api-client-library/Java/apis/pagespeedonline/v1

12
fujy

Существует сжатие цвета («качество сжатия») и разрешение сжатия («изменение размера»). Ответ Fujy касается качества сжатия, но не в этом основная экономия: основная экономия заключается в уменьшении размеров. Например. Я получил фотографию 4 МБ до 207K, используя максимальное качество сжатия, используя ответ fujy, и это выглядело ужасно, но я уменьшил его до 12K, используя приемлемое качество, но меньшего размера.

Таким образом, приведенный выше код должен использоваться для «качества сжатия», но это моя рекомендация для изменения размера:

https://github.com/rkalla/imgscalr/blob/master/src/main/Java/org/imgscalr/Scalr.Java

Я хотел бы, чтобы изменение размера было частью стандартных библиотек Java, но, похоже, это не так (или есть проблемы с качеством изображения со стандартными методами?). Но библиотека Рияда действительно маленькая - это всего лишь один класс. Я просто скопировал этот класс в свой проект, потому что я никогда не учился использовать Maven, и он прекрасно работает.

1
Tim Cooper