Generar Thumbnails de imagenes en un proyecto Spring Boot

En este tutorial, te enseñaré cómo generar miniaturas (thumbnails) de todas las imágenes dentro de un directorio en tu aplicación Spring Boot, utilizando la poderosa biblioteca Thumbnailator.

Requisitos

  • Tener un proyecto Spring Boot configurado.
  • Haber configurado Maven como sistema de dependencias.
Paso 1: Agregar la dependencia Thumbnailator

Lo primero es agregar la dependencia a tu archivo pom.xml:

XML
<dependency>
    <groupId>net.coobird</groupId>
    <artifactId>thumbnailator</artifactId>
    <version>0.4.20</version>
</dependency>

Esto descargará la biblioteca Thumbnailator, que es increíblemente fácil de usar para manipular imágenes en Java.

Paso 2: Crear un controlador para procesar las imágenes

El siguiente paso es crear un controlador en Spring Boot que recorra un directorio de imágenes y genere miniaturas de todas las imágenes en otro directorio.

Java
package com.example.demo.controller;

import java.io.File;
import java.io.IOException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import net.coobird.thumbnailator.Thumbnails;

@RestController
public class HomeController {

    Logger log = LogManager.getLogger(HomeController.class);

    @GetMapping("/")
    public String homepage(Model model) {
        String INPUT_PATH = "/home/itinajero/Downloads/fotografias";
        String OUTPUT_PATH = "/home/itinajero/Downloads/fotografias/thumbnails/";

        File inputDir = new File(INPUT_PATH);
        File[] files = inputDir.listFiles((dir, name) -> name.toLowerCase().endsWith(".jpg") || name.toLowerCase().endsWith(".png"));

        if (files != null) {
            for (File file : files) {
                try {
                    log.info("Procesando archivo: " + file.getName());
                    //Thumbnails.of(new File(INPUT_PATH, file.getName())).size(600, 500).toFile(new File(OUTPUT_PATH, file.getName()));
                    // Genera un thumbnail para cada archivo en el directorio
                    Thumbnails.of(file).scale(0.5).toFile(new File(OUTPUT_PATH, file.getName()));
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        } else {
            log.info("No se encontraron imágenes en el directorio.");
        }

        return "ok";
    }

}

Explicación del código:
  1. Directorio de entrada y salida:
    • INPUT_PATH: es el directorio donde se encuentran las imágenes originales.
    • OUTPUT_PATH: es el directorio donde se guardarán las miniaturas generadas.
  2. Filtro de archivos: Usamos listFiles con un filtro que selecciona archivos con las extensiones .jpg o .png.
  3. Generación de miniaturas: Utilizamos Thumbnails.of(file).scale(0.5).toFile(new File(OUTPUT_PATH, file.getName())) para crear una versión reducida de cada imagen, con un 50% del tamaño original.
  4. Logging: Utilizamos log.info() para registrar el progreso mientras se procesan las imágenes.
Paso 3: Prueba la aplicación

Cuando accedas a la URL raíz (/) de tu aplicación, este código recorrerá todas las imágenes en el directorio de entrada, generará miniaturas y las guardará en el directorio de salida.

Java
2024-10-07T15:24:49.692-06:00 INFO 206544 --- [nio-8080-exec-1] c.e.demo.controller.HomeController : Procesando archivo: 9UOL4RMZB881WH92.jpg
2024-10-07T15:24:50.513-06:00 INFO 206544 --- [nio-8080-exec-1] c.e.demo.controller.HomeController : Procesando archivo: HW5VA528LJBS9F67.jpg
2024-10-07T15:24:51.325-06:00 INFO 206544 --- [nio-8080-exec-1] c.e.demo.controller.HomeController : Procesando archivo: NGFGMIPXS5SD6U1K.jpg
2024-10-07T15:24:52.152-06:00 INFO 206544 --- [nio-8080-exec-1] c.e.demo.controller.HomeController : Procesando archivo: QO5AKI2FUD5U6GBQ.jpg
2024-10-07T15:24:52.878-06:00 INFO 206544 --- [nio-8080-exec-1] c.e.demo.controller.HomeController : Procesando archivo: RAD55JQZ2O0RO7VW.jpg
2024-10-07T15:24:53.599-06:00 INFO 206544 --- [nio-8080-exec-1] c.e.demo.controller.HomeController : Procesando archivo: 22RYU4UY8ZIBHMDS.jpg
2024-10-07T15:24:54.361-06:00 INFO 206544 --- [nio-8080-exec-1] c.e.demo.controller.HomeController : Procesando archivo: APEX26PXI65OVLKP.jpg
2024-10-07T15:24:55.136-06:00 INFO 206544 --- [nio-8080-exec-1] c.e.demo.controller.HomeController : Procesando archivo: V2L7QURPHAJSWKA1.jpg
2024-10-07T15:24:55.878-06:00 INFO 206544 --- [nio-8080-exec-1] c.e.demo.controller.HomeController : Procesando archivo: J6L5C5OR5N63G622.jpg
2024-10-07T15:24:56.478-06:00 INFO 206544 --- [nio-8080-exec-1] c.e.demo.controller.HomeController : Procesando archivo: Q702L9HMBNY6NM9M.jpg
2024-10-07T15:24:57.157-06:00 INFO 206544 --- [nio-8080-exec-1] c.e.demo.controller.HomeController : Procesando archivo: ETSOEYEKEKH67AUZ.jpg

Nota:

Es importante asegurarse de que los directorios de entrada y salida existan, y que los archivos de imagen estén en formatos compatibles como .jpg o .png.

¡Y eso es todo! Con este simple enfoque, puedes automatizar la generación de miniaturas en tu proyecto Spring Boot. Si tienes preguntas o comentarios, no dudes en dejar un comentario abajo.