¿Cómo puedo cambiar el tamaño de una imagen usando Java?

Resuelto pbreault asked hace 16 años • 19 respuestas

Necesito cambiar el tamaño de archivos PNG, JPEG y GIF. ¿Cómo puedo hacer esto usando Java?

pbreault avatar Oct 29 '08 00:10 pbreault
Aceptado

FWIW Acabo de lanzar (Apache 2, alojado en GitHub) una biblioteca simple de escalado de imágenes para Java llamada imgscalr (disponible en Maven central ).

La biblioteca implementa algunos enfoques diferentes para el escalado de imágenes (incluido el enfoque incremental de Chris Campbell con algunas mejoras menores) y elegirá el enfoque más óptimo para usted si así lo solicita, o le brindará el más rápido o el más atractivo (si lo desea). pide eso).

El uso es muy simple, solo un montón de métodos estáticos. El caso de uso más simple es:

BufferedImage scaledImage = Scalr.resize(myImage, 200);

Todas las operaciones mantienen las proporciones originales de la imagen, por lo que en este caso le está pidiendo a imgscalr que cambie el tamaño de su imagen dentro de unos límites de 200 píxeles de ancho y 200 píxeles de alto y, de forma predeterminada, seleccionará automáticamente el enfoque más rápido y más atractivo para eso desde que fue No se especifica.

Al principio me doy cuenta de que esto parece autopromoción (lo es), pero pasé una buena parte de mi tiempo buscando exactamente el mismo tema en Google y seguí obteniendo diferentes resultados/enfoques/pensamientos/sugerencias y decidí sentarme y escribir un implementación simple que abordaría el 80-85% de los casos de uso en los que tienes una imagen y probablemente quieras una miniatura para ella, ya sea lo más rápido posible o lo más atractiva posible (para aquellos que lo hayan probado, notarán haciendo un Graphics.drawImage incluso con interpolación BICUBIC a una imagen lo suficientemente pequeña, todavía parece basura).

Riyad Kalla avatar Dec 24 '2010 20:12 Riyad Kalla

Después de cargar la imagen puedes probar:

BufferedImage createResizedCopy(Image originalImage, 
            int scaledWidth, int scaledHeight, 
            boolean preserveAlpha)
    {
        System.out.println("resizing...");
        int imageType = preserveAlpha ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;
        BufferedImage scaledBI = new BufferedImage(scaledWidth, scaledHeight, imageType);
        Graphics2D g = scaledBI.createGraphics();
        if (preserveAlpha) {
            g.setComposite(AlphaComposite.Src);
        }
        g.drawImage(originalImage, 0, 0, scaledWidth, scaledHeight, null); 
        g.dispose();
        return scaledBI;
    }
Burkhard avatar Oct 28 '2008 17:10 Burkhard

Thumbnailator es una biblioteca de cambio de tamaño de imágenes de código abierto para Java con una interfaz fluida, distribuida bajo licencia MIT.

Escribí esta biblioteca porque crear miniaturas de alta calidad en Java puede ser sorprendentemente difícil y el código resultante puede ser bastante complicado. Con Thumbnailator, es posible expresar tareas bastante complicadas utilizando una API sencilla y fluida.

Un ejemplo sencillo

Para un ejemplo simple, tomar una imagen y cambiar su tamaño a 100 x 100 (preservando la relación de aspecto de la imagen original) y guardarla en un archivo se puede lograr en una sola declaración:

Thumbnails.of("path/to/image")
    .size(100, 100)
    .toFile("path/to/thumbnail");

Un ejemplo avanzado

La realización de tareas complejas de cambio de tamaño se simplifica con la fluida interfaz de Thumbnailator.

Supongamos que queremos hacer lo siguiente:

  1. tomar las imágenes en un directorio y,
  2. cambiar su tamaño a 100 x 100, con la relación de aspecto de la imagen original,
  3. guárdelos todos en archivos JPEG con configuraciones de calidad de 0.85,
  4. donde los nombres de los archivos se toman del original y thumbnail.se añaden al principio

Traducido a Thumbnailator, podríamos realizar lo anterior con lo siguiente:

Thumbnails.of(new File("path/to/directory").listFiles())
    .size(100, 100)
    .outputFormat("JPEG")
    .outputQuality(0.85)
    .toFiles(Rename.PREFIX_DOT_THUMBNAIL);

Una nota sobre la calidad y velocidad de la imagen.

Esta biblioteca también utiliza el método de escalado bilineal progresivo resaltado en Filthy Rich Clients de Chet Haase y Romain Guy para generar miniaturas de alta calidad y al mismo tiempo garantizar un rendimiento de tiempo de ejecución aceptable.

coobird avatar Feb 19 '2011 14:02 coobird

No necesitas una biblioteca para hacer esto. Puedes hacerlo con el propio Java.

Chris Campbell tiene un artículo excelente y detallado sobre cómo escalar imágenes; consulte este artículo .

Chet Haase y Romain Guy también tienen un artículo detallado y muy informativo sobre el escalado de imágenes en su libro Filthy Rich Clients .

David Koelle avatar Feb 10 '2009 18:02 David Koelle