Ajustar el tamaño de miles de imagenes en un servidor

Imaginen este escenario, durante X tiempo estuvieron almacenando imagenes de miles de sitios pero tan sólo querían tener una especie de thumbnail. Tomaron la foto default de cada página pero los tamaños no son precisamente lo que uno esperaba.

Te dejaste estar y ahora tenés una carpeta en el servidor con 1GB de fotos de las cuales sólo necesitabas unos pocos pixeles de cada una, un lindo lío de espacio en servidor ¿Cómo resolverlo?

Bajarlas todas y tirar un batch en Photoshop? esa sería la resolución más cabeza de termo posible, lo ideal es... hacerlo en el servidor!

Para hacerlo basta con una simple pero poderosísima herramienta: imagemagick

Es un programa que se puede ejecutar desde línea de comandos, que es lo que vamos a hacer, porque estamos en un servidor y con suerte te pudiste conectar por SSH. Si es así estás con suerte.

La versión sencilla desde Debian/Ubuntu es instalar todo:

sudo apt-get update
sudo apt-get install imagemagick -y

El comando básico es convert que nos permite como parece convertir una cosa en otra, podemos aclararle mil comandos pero lo interesante es que si le definimos proporciones máximas nos ajustará cualquier imagen a ese máximo:

convert image.jpg -resize 600x400\> image.jpg

Esto básicamente convierte image.jpg en un máximo de 600 pixeles de ancho y un máximo de 400 de alto y lo devuelve sobre sí mismo, image.jpg, sobreescribiendo.

Ahora esto hay que hacerlo en varios miles de casos a la vez así que deberíamos crear un archivo BASH para poder ejecutarlo:

mkdir -p ~/scripts

nano ~/scripts/batch-image-resize.sh

El script va a tener tres variables, FOLDER, la carpeta que queremos procesar, WIDTH para el tamaño máximo, HEIGHT para el alto máximo, estas tres las podemos cambiar a gusto antes de ejecutarlo.

Obviamente este script hará lo mismo de más arriba con el convert, sobreescribir todo, así que tengan en cuenta que "todo puede fallar", hacer un backup es lo recomendable.

#!/usr/bin/env bash
# Purpose: batch image resizer
# Source: https://guides.wp-bullet.com
# Author: Mike

# absolute path to image folder
FOLDER="/var/www/wp-bullet.com/wp-content/uploads"

# max height
WIDTH=540

# max width
HEIGHT=300

#resize png or jpg to either height or width, keeps proportions using imagemagick
#find ${FOLDER} -iname '*.jpg' -o -iname '*.png' -exec convert \{} -verbose -resize $WIDTHx$HEIGHT\> \{} \;

#resize png to either height or width, keeps proportions using imagemagick
#find ${FOLDER} -iname '*.png' -exec convert \{} -verbose -resize $WIDTHx$HEIGHT\> \{} \;

#resize jpg only to either height or width, keeps proportions using imagemagick
find ${FOLDER} -iname '*.jpg' -exec convert \{} -verbose -resize $WIDTHx$HEIGHT\> \{} \;

# alternative
#mogrify -path ${FOLDER} -resize ${WIDTH}x${HEIGHT}% *.png -verbose

Si, el código es de Mike y no vamos a robárselo, dejemos su copyright :P

Una forma de corroborar el peso de un directorio en particular es con el comando du:

du -sh foldername

Te va a dar el resultado en bytes de lo actualmente ocupado, si es la misma carpeta a modificar vamos a tener el tamaño inicial, luego lo ejecutaremos para ver cuánto ahorramos.

El script se ejecuta así:

bash ~/scripts/batch-image-resize.sh

Se va a tomar algún tiempo, el ejemplo de Mike de WP Bullet usa Screen para mantener la sesión abierta, no me hizo falta (si la conexión es buena no debería hacer falta).

Luego de pasar por toooodos los archivos JPG que encuentra podemos consultar con du si tuvo efecto positivo, en mi caso una carpeta de 1GB pasó a ocupar 500MB que era mucho más aceptable para hacer un backup de cosas que... ni necesito!

A convert se le pueden agregar más parámetros ya sea para comprimir más las imagenes o para hacer ajustes, en mi caso en particular lo default sobraba pero se puede jugar mucho con ImageMagick

Via WP Bullet

Otros posts que podrían llegar a gustarte...

Comentarios

  • Guido    

    Una termeda más simple es usar el irfanView. Gran programa para hacer resize, crop, rotaciones, cambio de formato... Hasta tiene el paint embebido. Lo amo

    • Responder
    • Citar
    • Comentado:
    • pero nene... si sólo tenés acceso a una terminal (como en mi caso), de eso se trata el ejemplo! no en tu máquina local sino en el servidor remoto

      • Responder
      • Citar
      • Comentado:
      • Andrew    

        Estos milenials :D

        • Citar
        • Comentado:
      • En pc va como piña, pero para tu server con consola no sirve.

        • Citar
        • Comentado:
    • Gustavo V    

      yo uso imagemagick aun en entorno local, es muchisimo mas rapido que un monton de otros programas.

      algo que no se puede scriptear en otras cosas es que te divida una imagen GIGANTE en pedazos mas chicos, para armar un mosaico, y que ese mosaico que genere un thumbnail de manera automatica.

      tengo compañeros que son tan millenian que ven una linea de comando y lloran.

      • Responder
      • Citar
      • Comentado:
  • Recuerdo cuando te dije que las miniaturas que usabas eran las imágenes grandes y mi conexión de 1Mb lloraba. Al ratito hiciste todas las miniaturas
    PD: Ahora ya tengo 3Mb de conexión

    • Responder
    • Citar
    • Comentado:
    • jaja bueno, años me lleva cada cosa, tengo que reprogramar linksdv...

      • Responder
      • Citar
      • Comentado:
  • Andrezgz    

    Lo he usado miles de veces. En un momento trabajé en la generación de 3 thumbnails jpg (con dimensiones distintas) a partir de la imagen subida (que podía estar en múltiples formatos). Dado que el proceso debía considerar varios ajustes a la imagen, lo estándar era ejecutar el convert para cada uno, para cada thumbnail, lo cual no era muy óptimo. Ahí descubrí que se podían poner todos juntos y hacer una sola invocación de convert por thumbnail.

    Para un ancho de 60px y un ancho de 70 px:
    convert image.jpg -flatten -resize 60x70^ -gravity center -crop 60x70+0+0 thumb_60x70.jpg

    El orden de aplicación de los parámetros es importante!

    -flatten: Crea un canvas con dimensiones de la imagen usando el color de fondo actual (blanco, si no encuentra otro definido en la imagen). Necesario pasa pasar un png transparente a jpg
    -resize: Redimensionar la imagen. El flag ^ hace que el cambio sea según la menor dimensión de las definidas, para que no se deforme.
    -gravity: Posicionarse en el centro de la imagen resultante
    -crop: Realizar un recorte (-crop) para quitar las partes excedentes de la imagen, de manera que llene completamente el área especificada (por haber usado resize con ^)

    Todavía recuerdo el momento en que se detectó una vulnerabilidad y se le dio un nombre memorable ImageTragick: https://imagetragick.com/

    • Responder
    • Citar
    • Comentado:
    • Revisado: 07/05/2019 - 18:56:37
  • Antonio    

    Que software recomiendan para organizar las fotos familiares en Windows ? Alguno particularmente bueno a la hora de navegar entre ellas y poder hacer vídeos simples?

    • Responder
    • Citar
    • Comentado:
    • En su época use mucho el picasa, cuando google lo discontinuo quede a la deriva, llorando...

      Ahora pase todo a google photos y esos features que requeris los tenes. Con el asistente podes hacer videos con fotos fácilmente.

      • Responder
      • Citar
      • Comentado:

Deje su comentario:

Tranquilo, su email nunca será revelado.
La gente de bien tiene URL, no se olvide del http/https
Para evitar bots, si se tardó mucho en leer la nota seguramente no sirva y tenga que intentar dos veces

Negrita Cursiva Imagen Enlace


comentarios ofensivos o que no hagan al enriquecimiento del post serán borrados/editados por el administrador