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.