Trabajo con imágenes en Java: cambio de tamaño (resize) y recorte (crop)
En el desarrollo web y de escritorio moderno con Java, a menudo surge la necesidad de procesar imágenes mediante programación: reducirlas para vistas previas, recortar bordes sobrantes o ajustarlas a proporciones determinadas. En la biblioteca estándar de Java (Java SE) no hay una clase única de alto nivel para estas operaciones, pero existe un potente conjunto de herramientas en los paquetes java.awt, java.awt.image y javax.imageio. En este artículo, analizaremos en detalle cómo realizar las operaciones de resize (cambio de tamaño) y crop (recorte) utilizando las herramientas integradas de Java.
Clases principales para trabajar con imágenes
Antes de comenzar con el código, conozcamos las clases clave:
javax.imageio.ImageIO– lectura y escritura de imágenes (soporta PNG, JPEG, BMP, GIF, etc.).java.awt.image.BufferedImage– imagen rasterizada con acceso a píxeles.java.awt.Graphics2D– clase para dibujar (escalado, recorte, superposición).java.awt.geom.AffineTransform– matriz de transformación para escalado preciso.
1. Cambio de tamaño de imagen (Resize)
La forma más común es redibujar la imagen original sobre un nuevo lienzo con las dimensiones deseadas. Para un resultado de calidad, use RenderingHints.
import javax.imageio.ImageIO;import java.awt.*;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;
public class ImageResizer {
public static BufferedImage resize(BufferedImage original, int targetWidth, int targetHeight) { BufferedImage resized = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = resized.createGraphics();
// Configuración de calidad de escalado 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; }
public static void main(String[] args) throws IOException { File input = new File("input.jpg"); BufferedImage source = ImageIO.read(input);
// Reducir a 300x200 BufferedImage output = resize(source, 300, 200); ImageIO.write(output, "jpg", new File("resized.jpg")); System.out.println("¡Resize completado!"); }}Notas importantes:
- Si no se establecen
RenderingHints, el resultado será de baja calidad (píxeles vecinos). - Para PNG con transparencia, use
BufferedImage.TYPE_INT_ARGB. - Las proporciones no se conservan automáticamente; si es necesario, calcule la relación de aspecto manualmente.
2. Conservación de proporciones (Aspect Ratio)
Para no distorsionar la imagen, calcule el nuevo tamaño manteniendo las proporciones:
public static BufferedImage resizeKeepRatio(BufferedImage original, int maxWidth, int maxHeight) { int origWidth = original.getWidth(); int origHeight = original.getHeight();
double widthRatio = (double) maxWidth / origWidth; double heightRatio = (double) maxHeight / origHeight; double ratio = Math.min(widthRatio, heightRatio);
int newWidth = (int) (origWidth * ratio); int newHeight = (int) (origHeight * ratio);
return resize(original, newWidth, newHeight);}3. Recorte de imagen (Crop)
El recorte en Java se realiza mediante el método getSubi
También en la biblioteca
Parseo de HTML en Go: revisión de bibliotecas y ejemplos de código
Configuración de aplicaciones Java: resumen de bibliotecas y herramientas
Actix-web para Rust: guía completa con ejemplos
Warp para Rust: guía completa con ejemplos
Configuración de aplicaciones Rust: bibliotecas config, envy y dotenvy