Jest wiele metod kompresji, wiele różnych algorytmów, które to wykonują. Oczywiście, można samemu napisać kompresję obrazu ale czy warto, skoro można skorzystać z gotowych rozwiązań. W javie z pomocą idą nam klasy z pakietu javax.imageio i przykładowy kod może wyglądać następująco.
private void compress(BufferedImage image, File file, float compressionLevel) {
ImageWriter writer = null;
Iterator iterator = ImageIO.getImageWritersByFormatName("jpg");
if (iterator.hasNext()) {
writer = (ImageWriter) iterator.next();
}
ImageOutputStream ios = null;
ios = ImageIO.createImageOutputStream(file);
writer.setOutput(ios);
ImageWriteParam imageWriteParam = writer.getDefaultWriteParam();
imageWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
imageWriteParam.setCompressionQuality(compressionLevel);
writer.write(null, new IIOImage(image, null, null), imageWriteParam);
ios.flush();
writer.dispose();
ios.close();
}
Ta metoda za parametry przyjmuje:
- obraz, kt6ry będzie kompresowany
- plik, do którego będzie zapisany skompresowany wynik
- oraz stopień kompresji. Współczynnik ten przyjmuje wartości od 0.0 do 1.0. Im niższy tym rozmiar pliku jest mniejszy ale jednocześnie gorsza jakość.
A kod początkowo pobiera writera dla odpowiedniego typu – jpg i ustawia odpowiedni outputStream, ustawia jego parametry i dokonuje kompresji. Oczywiście nie należy zapominać o obsłudze wyjątków, które tutaj są pominięte.