Crea collages de imágenes con la CLI de ImageMagick
Pasa a ImageMagick una lista explícita de imágenes para crear un collage en un orden predecible. El siguiente script de Bash crea una cuadrícula PNG, deja intactos los archivos de origen y lee solo los archivos que indiques. También rechaza los destinos existentes, por lo que volver a ejecutarlo no puede reemplazar un collage.
Configura ImageMagick
Usa Linux con Bash y una instalación de ImageMagick 7 que incluya soporte para JPEG y PNG. Este tutorial se probó con GNU Bash 5.3.15 e ImageMagick 7.1.2-31 Q16-HDRI. ImageMagick 6 y otros sistemas operativos quedan fuera del alcance probado de este ejemplo.
Pega los bloques de comandos en una shell de Bash con errexit desactivado,
para que un comando fallido devuelva el control al prompt. El script que guardarás a continuación
establece su propio manejo de errores.
Comprueba que las herramientas estén en tu PATH:
bash --version && magick --version
Configura los límites de recursos
Mantén la política de seguridad existente de tu instalación. Estos pequeños ejemplos no requieren modificar la política global. Puedes consultar los límites actuales con:
magick -list resource
Las imágenes más grandes pueden alcanzar los límites configurados aunque sus miniaturas sean pequeñas, porque la decodificación se realiza primero. Usa menos imágenes de origen o imágenes más pequeñas antes de cambiar una política. La documentación sobre la política de recursos de ImageMagick explica los controles.
Prepara tus imágenes
Empieza en un directorio con permisos de escritura. Este bloque crea un nuevo directorio
collage-demo con tres archivos JPEG de ejemplo y un directorio de salida separado.
Falla si collage-demo ya existe y deja la shell en su directorio original:
(
mkdir collage-demo || exit 1
cd collage-demo || exit 1
mkdir photos collages || exit 1
magick -size 320x160 xc:red photos/red.jpg &&
magick -size 160x320 xc:lime photos/green.jpg &&
magick -size 240x240 xc:blue photos/blue.jpg
)
Guarda el siguiente script como collage-demo/make-collage.sh. Sus argumentos son un nuevo destino
.png seguido de uno o más archivos locales de imágenes estáticas JPEG o PNG.
Pon cada ruta entre comillas y enumera los archivos en el orden en que quieras que aparezcan.
No uses *.jpg en un directorio que contenga imágenes generadas: la shell
incluiría también esas imágenes.
ImageMagick tiene su propia sintaxis de nombres de archivo, que incluye comodines y selectores de fotogramas. Las comillas de la shell por sí solas no la desactivan. El script copia cada entrada a un archivo temporal con un nombre normal antes de decodificarla y luego copia el PNG terminado al destino literal. Esto también permite manejar rutas que contienen espacios, corchetes o signos de porcentaje.
#!/usr/bin/env bash
set -euo pipefail
if (( $# < 2 )); then
printf 'Usage: bash make-collage.sh OUTPUT.png INPUT [INPUT ...]\n' >&2
exit 2
fi
output=$1
shift
if [[ "$output" != *.png ]]; then
printf 'Output must end in .png: %q\n' "$output" >&2
exit 2
fi
if [[ -e "$output" || -L "$output" ]]; then
printf 'Refusing existing output: %q\n' "$output" >&2
exit 1
fi
work=$(mktemp -d)
trap 'rm -rf -- "$work"' EXIT
tiles=()
for input in "$@"; do
if [[ ! -f "$input" || ! -r "$input" ]]; then
printf 'Not a readable file: %q\n' "$input" >&2
exit 1
fi
if ! cp -- "$input" "$work/source"; then
printf 'Cannot copy input: %q\n' "$input" >&2
exit 1
fi
tile="tile-${#tiles[@]}.png"
if ! (
cd -- "$work" &&
magick -regard-warnings 'source[0]' -auto-orient -colorspace sRGB \
-thumbnail 200x200 -background white -gravity center -extent 200x200 \
-alpha remove -alpha off -strip -depth 8 "$tile"
); then
printf 'Cannot decode input: %q\n' "$input" >&2
exit 1
fi
tiles+=("$tile")
done
(
cd -- "$work" &&
magick montage -regard-warnings "${tiles[@]}" -tile 3x \
-geometry 200x200+2+2 -background white -strip result.png
)
cp -- "$work/result.png" "$output"
printf 'Created %q\n' "$output"
Cada imagen cabe dentro de un mosaico de 200×200 sin recortes ni estiramientos; el área restante se rellena de blanco. La transparencia se compone sobre blanco, incluidos los píxeles parcialmente transparentes. El script aplica los metadatos de orientación antes de cambiar el tamaño y convierte los colores a sRGB antes de componer. Esta es una conversión genérica. Cuando la precisión del color sea importante, especialmente en imágenes CMYK o etiquetadas con ICC, usa un flujo de trabajo con perfiles de color adecuado.
Usa imágenes locales completas en las que confíes.
-regard-warnings trata algunas advertencias de
decodificación como errores; no valida la integridad de las imágenes. En la compilación probada,
un JPEG con datos truncados aun así produjo un collage e indicó éxito, con píxeles incorrectos
cerca del borde inferior de su mosaico. Revisa la entrada y todo el mosaico resultante cuando exista
la posibilidad de daños. Si una entrada contiene una secuencia, solo se usa el primer fotograma.
Crea un collage con montage
Desde el directorio que contiene collage-demo, ejecuta:
(
cd collage-demo &&
bash make-collage.sh collages/example.png \
photos/red.jpg photos/green.jpg photos/blue.jpg
)
Abre collage-demo/collages/example.png. Debería medir 612×204 píxeles y tener mosaicos rojos, verdes y
azules de izquierda a derecha. La imagen horizontal tiene relleno blanco arriba y abajo; la imagen
vertical tiene relleno a los lados. Hay 2 píxeles alrededor de cada mosaico, lo que deja un espacio
de 4 píxeles entre mosaicos vecinos. Revisa cada mosaico, incluidos sus bordes, cuando uses
fotografías reales.
Al repetir este comando, falla con «Refusing existing output» y deja ese PNG intacto. Elige un nuevo destino para crear otro collage. El script copia el resultado solo después de que todos los mosaicos y el montaje se completen correctamente; un error del sistema de archivos durante esa copia final aún puede dejar una salida parcial. Ejecuta las tareas de forma secuencial: la comprobación de existencia no protege frente a escrituras simultáneas en el mismo destino. Mantén los archivos de origen sin cambios mientras se ejecuta una tarea.
Personaliza el diseño
Las opciones de montage del script controlan
la cuadrícula. -tile 3x reserva tres columnas y usa tantas filas como sean
necesarias. -geometry 200x200+2+2 usa los mosaicos preparados de 200×200 con 2 píxeles de
espacio alrededor. Cuatro entradas producen una imagen de 612×408; las celdas sin usar de la última
fila son blancas. Con una o dos entradas también se reservan tres columnas. Para cambiar el tamaño
de las miniaturas, mantén la coherencia entre -thumbnail,
-extent y el tamaño en -geometry.
Procesamiento por lotes con manejo de errores
Este bloque crea dos collages a partir de conjuntos de entrada elegidos explícitamente. Continúa tras una tarea fallida y devuelve un estado distinto de cero si falla cualquiera de las dos tareas, aunque la última se complete correctamente:
(
cd collage-demo || exit 1
status=0
bash make-collage.sh collages/warm.png \
photos/red.jpg photos/green.jpg || status=1
bash make-collage.sh collages/cool.png \
photos/green.jpg photos/blue.jpg || status=1
exit "$status"
)
Los archivos de entrada ausentes o vacíos y los archivos que generan errores de decodificación hacen que falle su tarea e identifican la ruta seleccionada en el error. Los daños recuperables tienen la limitación descrita anteriormente. Si no se pasa ninguna ruta de entrada, se muestra el mensaje de uso. Las salidas existentes también cuentan como tareas fallidas; los resultados de las tareas completadas correctamente siguen disponibles.
Solución de problemas
Si falta magick, comprueba que hayas instalado la versión 7 y que el
directorio de su ejecutable esté en PATH. Si falta un decodificador JPEG
o PNG, se necesita una compilación con ese formato habilitado; instalar únicamente paquetes de
cabeceras no añade un decodificador a un binario existente.
Si una entrada falla, lee el diagnóstico que contiene su ruta original y luego inspecciona ese archivo. Si hay un error de la política de recursos, reduce la carga de trabajo y consulta la política de tu instalación. Si la copia final falla, comprueba que el directorio de salida exista y tenga permisos de escritura antes de probar con un nuevo destino. El script no crea ningún directorio de salida automáticamente.
Reemplaza las rutas de ejemplo por tu propia lista de imágenes una vez que funcione la demostración. Mantén explícito el orden de entrada y elige un nuevo destino PNG para cada collage.
