Java DIP - technika kompresji obrazu

Obraz można łatwo skompresować i zapisać za pomocą języka Java. Kompresja obrazu obejmuje konwersję obrazu do formatu jpg i przechowywanie go.

Aby skompresować obraz, odczytujemy go i konwertujemy na obiekt BufferedImage.

Ponadto otrzymujemy ImageWriter z getImageWritersByFormatName()metoda znaleziona w klasie ImageIO. Z tego ImageWriter utwórz plikImageWriteParamobiekt. Jego składnia jest podana poniżej -

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

Z tego obiektu ImageWriteParam można ustawić kompresję, wywołując te dwie metody, które są setCompressionMode() i setCompressionQuality(). Ich składnia jest taka, jak podano poniżej -

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

Metoda setCompressionMode () przyjmuje jako parametr Mode_EXPLICIT. Niektóre z pozostałych TRYBÓW są krótko opisane -

Sr.No. Tryby
1

MODE_DEFAULT

Jest to stała wartość, która może zostać przekazana do metod, aby włączyć tę funkcję w przyszłych zapisach.

2

MODE_DISABLED

Jest to stała wartość, którą można przekazać do metod, aby wyłączyć tę funkcję dla przyszłych zapisów.

3

MODE_EXPLICIT

Jest to stała wartość, która może zostać przekazana do metod, aby włączyć tę funkcję w przyszłych zapisach.

Oprócz metod kompresji istnieją inne metody udostępniane przez klasę ImageWriteParam. Są one krótko opisane -

Sr.No. Metoda i opis
1

canOffsetTiles()

Zwraca prawdę, jeśli piszący może wykonać kafelkowanie z niezerowymi przesunięciami siatki podczas pisania.

2

getBitRate(float quality)

Zwraca liczbę zmiennoprzecinkową wskazującą szacunkową liczbę bitów danych wyjściowych dla każdego bitu danych obrazu wejściowego na danym poziomie jakości.

3

getLocale()

Zwraca aktualnie ustawione ustawienie regionalne lub null, jeśli obsługiwane jest tylko domyślne ustawienie regionalne.

4

isCompressionLossless()

Zwraca wartość true, jeśli bieżący typ kompresji zapewnia kompresję bezstratną.

5

unsetCompression()

Usuwa wszelkie poprzednie ustawienia typu kompresji i jakości.

6

unsetTiling()

Usuwa wszystkie poprzednie parametry siatki kafelków określone przez wywołania setTiling.

Przykład

Poniższy przykład ilustruje użycie klasy ImageWriteParam do skompresowania obrazu -

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

Wynik

Kiedy wykonujesz podany kod, kompresuje obraz digital_image_processing.jpg do swojego odpowiednika skompresowanego obrazu i zapisuje go na dysku twardym pod nazwą compress.jpg.

Oryginalny obraz

Skompresowany obraz - współczynnik jakości - 0,05

Skompresowany obraz - współczynnik jakości - 0,5