¿Cómo puedo cambiar el tamaño de una imagen usando Java?
Necesito cambiar el tamaño de archivos PNG, JPEG y GIF. ¿Cómo puedo hacer esto usando Java?
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).
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;
}
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:
- tomar las imágenes en un directorio y,
- cambiar su tamaño a 100 x 100, con la relación de aspecto de la imagen original,
- guárdelos todos en archivos JPEG con configuraciones de calidad de
0.85
, - 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.
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 .