Java DIP - Bildkomprimierungstechnik
Ein Bild kann einfach über Java komprimiert und gespeichert werden. Bei der Komprimierung eines Bildes wird ein Bild in JPG konvertiert und gespeichert.
Um ein Bild zu komprimieren, lesen wir das Bild und konvertieren es in ein BufferedImage-Objekt.
Außerdem erhalten wir einen ImageWriter von getImageWritersByFormatName()Methode in der ImageIO-Klasse gefunden. Erstellen Sie mit diesem ImageWriter eineImageWriteParamObjekt. Die Syntax ist unten angegeben -
Iterator<ImageWriter> list = ImageIO.getImageWritersByFormatName("jpg");
ImageWriteParam obj = writer_From_List.getDefaultWriteParam();
In diesem ImageWriteParam-Objekt können Sie die Komprimierung festlegen, indem Sie diese beiden Methoden aufrufen setCompressionMode() und setCompressionQuality(). Ihre Syntax ist wie folgt:
obj.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
obj.setCompressionQuality(0.05f);
Die Methode setCompressionMode () verwendet Mode_EXPLICIT als Parameter. Einige der anderen Modi werden kurz beschrieben -
Sr.Nr. | Modi |
---|---|
1 | MODE_DEFAULT Es ist ein konstanter Wert, der an Methoden übergeben werden kann, um diese Funktion für zukünftige Schreibvorgänge zu aktivieren. |
2 | MODE_DISABLED Es ist ein konstanter Wert, der an Methoden übergeben werden kann, um diese Funktion für zukünftige Schreibvorgänge zu deaktivieren. |
3 | MODE_EXPLICIT Es ist ein konstanter Wert, der an Methoden übergeben werden kann, um diese Funktion für zukünftige Schreibvorgänge zu aktivieren. |
Neben den Komprimierungsmethoden gibt es noch andere Methoden, die von der ImageWriteParam-Klasse bereitgestellt werden. Sie werden kurz beschrieben -
Sr.Nr. | Methode & Beschreibung |
---|---|
1 | canOffsetTiles() Es gibt true zurück, wenn der Writer beim Schreiben Kacheln mit Rasterversätzen ungleich Null durchführen kann. |
2 | getBitRate(float quality) Es gibt einen Gleitkommawert zurück, der eine Schätzung der Anzahl von Bits von Ausgangsdaten für jedes Bit von Eingangsbilddaten bei der gegebenen Qualitätsstufe angibt. |
3 | getLocale() Es gibt das aktuell festgelegte Gebietsschema zurück oder null, wenn nur ein Standardgebietsschema unterstützt wird. |
4 | isCompressionLossless() Es gibt true zurück, wenn der aktuelle Komprimierungstyp eine verlustfreie Komprimierung bietet. |
5 | unsetCompression() Alle vorherigen Einstellungen für Komprimierungstyp und -qualität werden entfernt. |
6 | unsetTiling() Es entfernt alle vorherigen Kachelgitterparameter, die durch Aufrufe von setTiling angegeben wurden. |
Beispiel
Das folgende Beispiel zeigt die Verwendung der ImageWriteParam-Klasse zum Komprimieren eines Bildes.
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();
}
}
Ausgabe
Wenn Sie den angegebenen Code ausführen, wird das Bild komprimiert digital_image_processing.jpg auf das entsprechende komprimierte Image und schreibt es mit dem Namen auf die Festplatte compress.jpg.