Trabalho com imagens em Java: bibliotecas e exemplos práticos
O Java fornece ferramentas integradas poderosas para trabalhar com imagens raster. Neste artigo, abordaremos a biblioteca padrão javax.imageio, o pacote java.awt.image e a popular biblioteca de terceiros Thumbnailator. Você aprenderá a ler, salvar, redimensionar, aplicar filtros e converter formatos de imagem.
1. Fundamentos: pacote javax.imageio e BufferedImage
A classe chave para representar uma imagem na memória é BufferedImage. Ela permite obter e modificar pixels, trabalhar com diferentes modelos de cores (RGB, ARGB) e tipos de dados.
Lendo uma imagem de um arquivo
import javax.imageio.ImageIO;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;
public class ImageReadExample { public static void main(String[] args) { try { File inputFile = new File("input.jpg"); BufferedImage image = ImageIO.read(inputFile); System.out.println("Largura: " + image.getWidth()); System.out.println("Altura: " + image.getHeight()); System.out.println("Tipo: " + image.getType()); } catch (IOException e) { e.printStackTrace(); } }}Escrevendo uma imagem em um arquivo
File outputFile = new File("output.png");ImageIO.write(image, "png", outputFile); // O formato é determinado pela extensãoFormatos suportados: JPEG, PNG, BMP, WBMP, GIF (somente leitura). A lista completa pode ser obtida através de ImageIO.getReaderFormatNames().
2. Redimensionamento e transformações com Java 2D
O pacote java.awt.Graphics2D permite realizar redimensionamento de qualidade, rotação, reflexão e sobreposição de imagens.
Redimensionamento mantendo a proporção
import java.awt.Graphics2D;import java.awt.RenderingHints;import java.awt.image.BufferedImage;
public class ImageResizer { public static BufferedImage resize(BufferedImage original, int targetWidth, int targetHeight) { BufferedImage resized = new BufferedImage(targetWidth, targetHeight, original.getType()); Graphics2D g2d = resized.createGraphics(); // Ativa o suavização para melhor qualidade g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2d.drawImage(original, 0, 0, targetWidth, targetHeight, null); g2d.dispose(); return resized; }}Rotação da imagem em 90 graus
public static BufferedImage rotate(BufferedImage image, double angleDegrees) { double radians = Math.toRadians(angleDegrees); int w = image.getWidth(); int h = image.getHeight(); // Novo tamanho após a rotação int newW = (int) Math.abs(w * Math.cos(radians)) + (int) Math.abs(h * Math.sin(radians)); int newH = (int) Math.abs(h * Math.cos(radians)) + (int) Math.abs(w * Math.sin(radians)); BufferedImage rotated = new BufferedImage(newW, newH, BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = rotated.createGraphics(); g2d.translate((newW - w) / 2.0, (newH - h) / 2.0); g2d.rotate(radians, w / 2.0, h / 2.0); g2d.drawImage(image, 0, 0, null); g2d.dispose(); return rotated;}3. Aplicação de filtros: desfoque, contraste, brilho
Para filtragem, use BufferedImageOp (do pacote java.awt.image). As implementações mais úteis são:
- \