Java DIP - Tecnica di compressione delle immagini

Un'immagine può essere facilmente compressa e archiviata tramite Java. La compressione dell'immagine implica la conversione di un'immagine in jpg e la sua memorizzazione.

Per comprimere un'immagine, leggiamo l'immagine e la convertiamo in oggetto BufferedImage.

Inoltre, otteniamo un ImageWriter da getImageWritersByFormatName()metodo trovato nella classe ImageIO. Da questo ImageWriter, crea un fileImageWriteParamoggetto. La sua sintassi è data di seguito:

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

Da questo oggetto ImageWriteParam è possibile impostare la compressione chiamando questi due metodi che sono setCompressionMode() e setCompressionQuality(). Le loro sintassi sono le seguenti:

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

Il metodo setCompressionMode () accetta Mode_EXPLICIT come parametro. Alcuni degli altri MODI sono descritti brevemente:

Sr.No. Modalità
1

MODE_DEFAULT

È un valore costante che può essere passato ai metodi per abilitare tale funzionalità per le scritture future.

2

MODE_DISABLED

È un valore costante che può essere passato ai metodi per disabilitare tale funzionalità per le scritture future.

3

MODE_EXPLICIT

È un valore costante che può essere passato ai metodi per abilitare tale funzionalità per le scritture future.

Oltre ai metodi di compressione, esistono altri metodi forniti dalla classe ImageWriteParam. Sono descritti brevemente:

Sr.No. Metodo e descrizione
1

canOffsetTiles()

Restituisce vero se il writer può eseguire l'affiancamento con offset di griglia diversi da zero durante la scrittura.

2

getBitRate(float quality)

Restituisce un float che indica una stima del numero di bit di dati in uscita per ogni bit di dati di immagine in ingresso a un dato livello di qualità.

3

getLocale()

Restituisce le impostazioni internazionali attualmente impostate o null se sono supportate solo le impostazioni internazionali predefinite.

4

isCompressionLossless()

Restituisce true se il tipo di compressione corrente fornisce una compressione senza perdite.

5

unsetCompression()

Rimuove qualsiasi tipo di compressione precedente e impostazioni di qualità.

6

unsetTiling()

Rimuove tutti i precedenti parametri della griglia di tessere specificati dalle chiamate a setTiling.

Esempio

L'esempio seguente mostra l'uso della classe ImageWriteParam per comprimere un'immagine:

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

Produzione

Quando esegui il codice dato, comprime l'immagine digital_image_processing.jpg alla sua immagine compressa equivalente e la scrive sul disco rigido con il nome compress.jpg.

Immagine originale

Immagine compressa - Fattore di qualità - 0,05

Immagine compressa - Fattore di qualità - 0,5