Hoy vamos a crear un contenedor Docker que nos permitirá comprimir imágenes jpg dentro de un directorio.
Comprimir imágenes es muy importante, sobre todo a la hora de montar un servicio web. Este contenedor nos permitirá tener a mano un compresor de imágenes muy pontente creado por Mozilla y agilizará el proceso de descarga de nuestros usuarios.
Lo primero que haremos es crear este Dockerfile
# Usa la imagen base de Alpine Linux FROM alpine:latest # Actualiza el índice de paquetes y luego instala las herramientas necesarias, incluyendo un compilador de C RUN apk update && \ apk add --no-cache \ cmake \ autoconf \ automake \ libtool \ nasm \ make \ pkgconfig \ git \ libpng-dev \ zlib-dev \ build-base # Clona el repositorio de MozJPEG desde GitHub RUN git clone https://github.com/mozilla/mozjpeg.git /mozjpeg # Cambia al directorio de trabajo de MozJPEG WORKDIR /mozjpeg # Configura, compila e instala MozJPEG RUN mkdir build && cd build && \ cmake -G"Unix Makefiles" .. -DPNG_SUPPORTED=0 && \ make install # Crea enlaces simbólicos solo si no existen previamente RUN test -f /opt/mozjpeg/bin/cjpeg || ln -s /usr/local/bin/cjpeg /opt/mozjpeg/bin/cjpeg && \ test -f /opt/mozjpeg/bin/djpeg || ln -s /usr/local/bin/djpeg /opt/mozjpeg/bin/djpeg # Cambia al directorio de trabajo WORKDIR / CMD ["tail", "-f", "/dev/null"]
Esto nos creará la imagen con la librería MozJPEG
Ahora creamos un docker-compose.yml para levantar el contenedor.
version: '3' services: mozjpeg: build: context: . dockerfile: Dockerfile container_name: mozjpeg-container #tty: true volumes: - ${IMAGES_FOLDER}:/imagenes
Y creamos el .env que nos permitirá definir IMAGES_FOLDER
.env
IMAGES_FOLDER=./imagenes
El proyecto queda así:
Podeís crear el .gitignore:
.DS_Store .env # Ignorar archivos generados durante la construcción de la imagen .DS_Store .idea/ .vscode/ *.log *.pid *.pyc imagenes/*
Una vez creado, tendremos que ejecutarlo:
docker compose up -d
Y podemos lanzar el comando que nos comprimirá los elementos:
docker exec mozjpeg-container sh -c 'cd /imagenes && for file in *.jpg; do /opt/mozjpeg/bin/cjpeg -quality 80 "$file" > "$file.tmp" && mv "$file.tmp" "$file"; done'
En cuanto a la calidad quality 80 que se indica en el comando, podemos usar esta estrategia:
- Calidad aceptable: Para la mayoría de las imágenes en un sitio web, una calidad entre 60 y 80 es generalmente suficiente. Esto reduce el tamaño del archivo considerablemente sin una pérdida significativa en la calidad visual.
- Fotografías de alta calidad: Si tu sitio web incluye imágenes de alta calidad, como fotografías profesionales, puedes optar por una calidad más alta, entre 80 y 90. Esto conservará más detalles y colores, pero también resultará en archivos más grandes.
- Gráficos y logotipos: Para gráficos, logotipos y otros elementos visuales que contienen áreas sólidas de color y bordes nítidos, puedes usar una calidad más baja, entre 50 y 70, sin que se note mucho la pérdida de calidad.
- Prueba y optimización: Siempre es recomendable realizar pruebas y optimizaciones para encontrar el equilibrio adecuado entre calidad visual y tamaño del archivo. Puedes probar diferentes configuraciones de calidad y verificar cómo afectan al rendimiento de tu sitio web utilizando herramientas de análisis de rendimiento web.
- Compresión sin pérdida: Para imágenes que necesitan mantener la calidad original, como logotipos o ilustraciones detalladas, considera utilizar formatos de imagen con compresión sin pérdida, como PNG.
Para que la tarea de comprimir se lleve de forma periódica, se puede ejecutar mediante un cron o usando ofelia.
Ingeniero en Informática, me encanta crear cosas o arreglarlas y darles una nueva vida. Escritor y poeta. Más de 20 APPs publicadas y un libro en Amazon.