Java DIP - Техника сжатия изображений

Изображение можно легко сжать и сохранить с помощью Java. Сжатие изображения включает преобразование изображения в jpg и его сохранение.

Чтобы сжать изображение, мы читаем изображение и конвертируем его в объект BufferedImage.

Далее получаем ImageWriter из getImageWritersByFormatName()метод, найденный в классе ImageIO. Из этого ImageWriter создайтеImageWriteParamобъект. Его синтаксис приведен ниже -

Iterator<ImageWriter> list = ImageIO.getImageWritersByFormatName("jpg");
ImageWriteParam obj = writer_From_List.getDefaultWriteParam();

Из этого объекта ImageWriteParam вы можете установить сжатие, вызвав эти два метода, которые setCompressionMode() и setCompressionQuality(). Их синтаксисы приведены ниже -

obj.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
obj.setCompressionQuality(0.05f);

Метод setCompressionMode () принимает в качестве параметра Mode_EXPLICIT. Некоторые другие РЕЖИМЫ описаны кратко -

Sr. No. Режимы
1

MODE_DEFAULT

Это постоянное значение, которое может быть передано в методы, чтобы включить эту функцию для будущих операций записи.

2

MODE_DISABLED

Это постоянное значение, которое может быть передано в методы, чтобы отключить эту функцию для будущих операций записи.

3

MODE_EXPLICIT

Это постоянное значение, которое может быть передано в методы, чтобы включить эту функцию для будущих операций записи.

Помимо методов сжатия, существуют другие методы, предоставляемые классом ImageWriteParam. Они кратко описаны -

Sr. No. Метод и описание
1

canOffsetTiles()

Он возвращает истину, если писатель может выполнять мозаику с ненулевым смещением сетки во время записи.

2

getBitRate(float quality)

Он возвращает число с плавающей запятой, указывающее оценку количества бит выходных данных для каждого бита входных данных изображения с заданным уровнем качества.

3

getLocale()

Он возвращает текущий установленный языковой стандарт или null, если поддерживается только языковой стандарт по умолчанию.

4

isCompressionLossless()

Он возвращает true, если текущий тип сжатия обеспечивает сжатие без потерь.

5

unsetCompression()

Он удаляет все предыдущие настройки типа сжатия и качества.

6

unsetTiling()

Он удаляет все предыдущие параметры сетки тайлов, указанные в вызовах setTiling.

пример

В следующем примере демонстрируется использование класса ImageWriteParam для сжатия изображения.

import java.io.*;
import java.util.*;
import java.awt.image.*;

import javax.imageio.*;
import javax.imageio.stream.ImageOutputStream;

class Compression {

   public static void main(String[] args) throws IOException {
   
      File input = new File("digital_image_processing.jpg");
      BufferedImage image = ImageIO.read(input);

      File compressedImageFile = new File("compress.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);
      writer.write(null, new IIOImage(image, null, null), param);
      
      os.close();
      ios.close();
      writer.dispose();
   }
}

Вывод

Когда вы выполняете данный код, он сжимает изображение digital_image_processing.jpg в его эквивалентный сжатый образ и записывает его на жесткий диск с именем compress.jpg.

Исходное изображение

Сжатое изображение - коэффициент качества - 0,05

Сжатое изображение - коэффициент качества - 0,5