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.