Java DIP - Técnica de compressão de imagem
Uma imagem pode ser facilmente compactada e armazenada por meio do Java. A compactação de imagem envolve a conversão de uma imagem em jpg e seu armazenamento.
Para compactar uma imagem, lemos a imagem e a convertemos no objeto BufferedImage.
Além disso, obtemos um ImageWriter de getImageWritersByFormatName()método encontrado na classe ImageIO. A partir deste ImageWriter, crie umImageWriteParamobjeto. Sua sintaxe é fornecida abaixo -
Iterator<ImageWriter> list = ImageIO.getImageWritersByFormatName("jpg");
ImageWriteParam obj = writer_From_List.getDefaultWriteParam();
A partir deste objeto ImageWriteParam, você pode definir a compactação chamando esses dois métodos que são setCompressionMode() e setCompressionQuality(). Suas sintaxes são as fornecidas abaixo -
obj.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
obj.setCompressionQuality(0.05f);
O método setCompressionMode () leva Mode_EXPLICIT como parâmetro. Alguns dos outros MODOS são descritos resumidamente -
Sr. Não. | Modos |
---|---|
1 | MODE_DEFAULT É um valor constante que pode ser passado para métodos para habilitar esse recurso para gravações futuras. |
2 | MODE_DISABLED É um valor constante que pode ser passado para métodos para desativar esse recurso para gravações futuras. |
3 | MODE_EXPLICIT É um valor constante que pode ser passado para métodos para habilitar esse recurso para gravações futuras. |
Além dos métodos de compressão, existem outros métodos fornecidos pela classe ImageWriteParam. Eles são descritos resumidamente -
Sr. Não. | Método e Descrição |
---|---|
1 | canOffsetTiles() Ele retorna verdadeiro se o gravador puder executar lado a lado com deslocamentos de grade diferentes de zero durante a gravação. |
2 | getBitRate(float quality) Ele retorna um float indicando uma estimativa do número de bits de dados de saída para cada bit de dados de imagem de entrada no nível de qualidade fornecido. |
3 | getLocale() Ele retorna o Locale atualmente definido ou null se apenas um Locale padrão for suportado. |
4 | isCompressionLossless() Ele retorna verdadeiro se o tipo de compactação atual fornece compactação sem perdas. |
5 | unsetCompression() Ele remove qualquer tipo de compactação e configurações de qualidade anteriores. |
6 | unsetTiling() Ele remove quaisquer parâmetros de grade de blocos anteriores especificados por chamadas para setTiling. |
Exemplo
O exemplo a seguir demonstra o uso da classe ImageWriteParam para compactar uma imagem -
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();
}
}
Resultado
Quando você executa o código fornecido, ele compacta a imagem digital_image_processing.jpg para sua imagem compactada equivalente e grava-a no disco rígido com o nome compress.jpg.