Java DIP: técnica de compresión de imágenes

Una imagen se puede comprimir y almacenar fácilmente a través de Java. La compresión de imágenes implica convertir una imagen a jpg y almacenarla.

Para comprimir una imagen, leemos la imagen y la convertimos en un objeto BufferedImage.

Además, obtenemos un ImageWriter de getImageWritersByFormatName()método que se encuentra en la clase ImageIO. Desde este ImageWriter, cree unImageWriteParamobjeto. Su sintaxis se da a continuación:

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

Desde este objeto ImageWriteParam, puede establecer la compresión llamando a estos dos métodos que son setCompressionMode() y setCompressionQuality(). Sus sintaxis son las que se indican a continuación:

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

El método setCompressionMode () toma Mode_EXPLICIT como parámetro. Algunos de los otros MODOS se describen brevemente:

No Señor. Modos
1

MODE_DEFAULT

Es un valor constante que se puede pasar a los métodos para habilitar esa característica para futuras escrituras.

2

MODE_DISABLED

Es un valor constante que se puede pasar a los métodos para deshabilitar esa función para futuras escrituras.

3

MODE_EXPLICIT

Es un valor constante que se puede pasar a los métodos para habilitar esa característica para futuras escrituras.

Aparte de los métodos de compresión, existen otros métodos proporcionados por la clase ImageWriteParam. Se describen brevemente:

No Señor. Método y descripción
1

canOffsetTiles()

Devuelve verdadero si el escritor puede realizar el mosaico con desplazamientos de cuadrícula distintos de cero mientras escribe.

2

getBitRate(float quality)

Devuelve un flotador que indica una estimación del número de bits de datos de salida para cada bit de datos de imagen de entrada en el nivel de calidad dado.

3

getLocale()

Devuelve la configuración regional establecida actualmente, o nula si solo se admite una configuración regional predeterminada.

4

isCompressionLossless()

Devuelve verdadero si el tipo de compresión actual proporciona una compresión sin pérdidas.

5

unsetCompression()

Elimina cualquier tipo de compresión y configuración de calidad anteriores.

6

unsetTiling()

Elimina cualquier parámetro de cuadrícula de mosaicos anterior especificado por llamadas a setTiling.

Ejemplo

El siguiente ejemplo demuestra el uso de la clase ImageWriteParam para comprimir una imagen:

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

Salida

Cuando ejecuta el código dado, comprime la imagen digital_image_processing.jpg a su imagen comprimida equivalente y la escribe en el disco duro con el nombre compress.jpg.

Imagen original

Imagen comprimida - Factor de calidad - 0.05

Imagen comprimida - Factor de calidad - 0.5