Java Image I/O API: redimensionar y recortar imágenes | Guía

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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

Recommendations