Componer imágenes remotas con cURL e ImageMagick
Combinar un fondo descargado con una superposición resulta útil para informes, paneles y vistas previas generadas. Este ejemplo compone imágenes de la NASA; no es una integración de datos meteorológicos en vivo. La misma estructura de procesamiento puede funcionar con un proveedor meteorológico una vez que se verifiquen las URL de sus imágenes, sus licencias y sus requisitos de actualización.
Compatibilidad de versiones
Usa Bash, ImageMagick 7 con el comando magick, y cURL 8.4 o más reciente. El requisito de cURL
importa porque el límite de tamaño de descarga también debe detener las respuestas sin una longitud
de contenido conocida. Mantén tanto las herramientas de descarga como las de decodificación de
imágenes en versiones con mantenimiento.
Descripción general
Un pipeline confiable debe verificar las descargas que realmente procesa, en lugar de descargar una vez para probar una URL y luego volver a descargar sin verificación. El script descarga cada fuente en un directorio de trabajo privado, compone la imagen y elimina los archivos de entrada temporales. Un directorio de salida nuevo evita colisiones con resultados anteriores.
Configurar el pipeline
El ejemplo usa una foto del alunizaje y un logotipo de la NASA desde URL alojadas por la NASA. Respeta las pautas de uso de imágenes y medios de la NASA, incluidas las restricciones sobre el uso de su insignia; estos recursos de ejemplo no implican respaldo alguno.
Requisitos de la sustitución de procesos
La sustitución de procesos como <(curl ...) es una característica de Bash, no un requisito del shell
POSIX. Más importante aún, el fallo de una descarga en segundo plano no se convierte automáticamente
en el estado de salida del comando de imagen. Esta implementación usa descargas verificadas
explícitamente en lugar de sustitución de procesos.
Descargar y componer imágenes sobre la marcha
Guarda lo siguiente como compose.sh. Proporciona dos URL HTTPS de confianza y un directorio de salida nuevo:
#!/bin/bash
set -euo pipefail
if [ "$#" -ne 3 ]; then
echo "Usage: $0 <background-https-url> <overlay-https-url> <new-output-directory>" >&2
exit 1
fi
background_url=$1
overlay_url=$2
output_dir=$3
[[ $output_dir = /* ]] || output_dir=$PWD/$output_dir
if ! mkdir -m 700 -- "$output_dir"; then
echo "Use a new output directory" >&2
exit 1
fi
cleanup() {
local status=$?
rm -f -- "$output_dir/background.image" "$output_dir/overlay.image"
if [ "$status" -ne 0 ]; then
rm -f -- "$output_dir/result.jpg"
rmdir -- "$output_dir"
fi
}
trap cleanup EXIT
fetch_image() {
curl --disable --globoff --fail --silent --show-error --location \
--proto '=https' --proto-redir '=https' --max-redirs 3 \
--connect-timeout 10 --max-time 30 --retry 2 --retry-max-time 60 \
--max-filesize 10485760 --output "$2" --url "$1"
}
fetch_image "$background_url" "$output_dir/background.image"
fetch_image "$overlay_url" "$output_dir/overlay.image"
cd -P -- "$output_dir"
output_dir=$PWD
magick -limit memory 256MiB -limit map 512MiB -limit disk 1GiB \
-limit width 10000 -limit height 10000 \
background.image -resize '1600x1600>' \
\( overlay.image -resize '300x300>' \) \
-gravity southeast -geometry +20+20 -composite result.jpg
[ -s result.jpg ] || { echo "No image produced" >&2; exit 1; }
echo "Composite saved: $output_dir/result.jpg"
Ejecútalo con un almacenamiento de salida nuevo:
bash compose.sh \
'https://images-assets.nasa.gov/image/as11-40-5874/as11-40-5874~orig.jpg' \
'https://www.nasa.gov/wp-content/uploads/2023/04/nasa-logo-web-rgb.png' \
nasa-composite
Un trabajo completado contiene result.jpg. Los fallos de descarga o de decodificación devuelven un
estado de salida distinto de cero y eliminan únicamente los archivos parciales del propio trabajo.
No permitas que otros procesos escriban en ese directorio mientras el trabajo se ejecuta.
Consideraciones de memoria
Un archivo comprimido pequeño puede decodificarse en una imagen grande. El script limita los bytes descargados, las dimensiones de la imagen decodificada y los recursos de caché de ImageMagick, pero esos ajustes no constituyen un límite completo de memoria del proceso ni de tiempo de ejecución. ImageMagick puede usar almacenamiento temporal en disco para las cachés de píxeles. Configura su política de seguridad e impón límites de memoria, disco y tiempo del sistema operativo para los procesos de trabajo de producción.
Consideraciones de seguridad
Usa fuentes de imágenes conocidas y de confianza. La transferencia exclusivamente por HTTPS y la verificación de certificados no evitan el SSRF: una URL o una redirección arbitraria todavía puede apuntar a un servicio de la red privada. Una API pública de subida o de procesamiento de URL necesita una política de origen aparte, validación de redirecciones, controles de salida de red y autenticación. No expongas este script de shell como un descargador de URL sin restricciones.
No desactives la verificación TLS ni las comprobaciones de revocación de certificados para que pase
una descarga que falla. Mantén la configuración y las credenciales de cURL fuera de este proceso de
trabajo; --disable evita la carga automática del archivo de configuración predeterminado de curl
del usuario.
Aplicaciones en el mundo real
Esta estructura puede componer imágenes para paneles, superposiciones de eventos o ilustraciones de informes. Valida la fuente de datos original real, la política de actualización, las dimensiones de la imagen y los derechos de uso de cada flujo de trabajo. El ejemplo de la NASA demuestra la composición, no la predicción meteorológica ni una prueba de referencia de latencia.
Manejo de errores y optimización
La única función auxiliar fetch_image concentra las opciones de descarga y la política de reintentos
para ambas fuentes. Los reintentos están acotados y se aplican a los fallos reintentables de cURL.
Un 404 o una imagen inválida debe fallar de forma visible en lugar de tratarse como una
superposición vacía pero exitosa. Verifica el estado de salida del script antes de publicar su
resultado.
Almacenar en caché las entradas validadas puede reducir las descargas repetidas. Mantén explícitas la vigencia y la integridad de la caché; no agregues una segunda descarga sin verificar después de una comprobación exitosa.
Conclusión
cURL e ImageMagick forman un pipeline de automatización útil cuando se verifican las transferencias reales, el resultado del decodificador y la propiedad de la salida. Reutiliza una sola política de descarga, mantén privados los archivos intermedios e inspecciona la imagen compuesta antes de publicarla.
Para flujos de trabajo de imágenes gestionados, explora el servicio de procesamiento de imágenes de Transloadit.
