Redimensionar imágenes y convertir formatos con ImageMagick
Usa ImageMagick para ajustar los JPEG dentro de un recuadro de 800 × 600 y guardar copias en PNG conservando los originales. Empieza con una carpeta plana y luego usa el script de Bash de más abajo para procesar carpetas anidadas sin perder archivos que compartan el nombre. Cada ejemplo crea un directorio de salida nuevo y se niega a reutilizarlo.
PNG resulta útil cuando el siguiente paso de tu flujo de trabajo necesita un almacenamiento de imágenes sin pérdida. Convertir un JPEG a PNG no recupera el detalle que ya se perdió con la compresión JPEG ni garantiza un archivo más pequeño. Si tu objetivo son fotografías más ligeras para un sitio web, consulta la receta para JPEG.
Configura ImageMagick 7
Estos ejemplos requieren Bash, find e ImageMagick 7 con compatibilidad con JPEG y PNG. Se probaron
en macOS con ImageMagick 7.1.2-31 y Bash 3.2.57 y 5.3.20. Ejecuta los bloques de comandos en Bash;
de lo contrario, la Terminal de macOS puede iniciar otro shell.
Con Homebrew instalado, usa las instrucciones de instalación para macOS de ImageMagick:
brew install imagemagick
En Linux, comprueba la versión de tu distribución antes de instalar. Por ejemplo, el
paquete imagemagick de Ubuntu 24.04 ofrece la versión 6.
Estos comandos requieren la versión 7; consulta las descargas oficiales
si tu paquete no la incluye.
ImageMagick también tiene un instalador para Windows, pero este tutorial no cubre PowerShell ni el Símbolo del sistema. Una instalación en Windows por sí sola no proporciona el entorno de Bash que se usa aquí.
Comprueba la versión instalada y los formatos disponibles:
magick -version && magick -list format
Busca ImageMagick 7 en la línea de versión y rw en la columna de modo, tanto para JPEG como para PNG.
Si falta magick, corrige la instalación o el PATH antes de continuar.
Redimensiona y convierte una carpeta plana
En tu directorio de trabajo, crea una carpeta de entrada y coloca dentro algunos JPEG. Este comando de preparación también acepta un directorio de entrada existente y no modifica su contenido:
mkdir -p input_images
Los comandos cortos procesan los archivos .jpg en minúsculas y no ocultos que están directamente dentro de input_images.
Para carpetas anidadas, otras extensiones de JPEG o nombres que contengan corchetes o comodines,
usa el script recursivo en su lugar.
Normalmente, mogrify sobrescribe sus archivos de entrada.
Aquí, -path dirige las copias PNG a un directorio nuevo. El && impide la conversión si ese
directorio ya existe o no se puede crear:
mkdir resized_png &&
magick mogrify -regard-warnings -define registry:filename:literal=true \
-auto-orient -resize '800x600>' -format png -path resized_png ./input_images/*.jpg
-auto-orient aplica la orientación EXIF del JPEG antes de redimensionar.
-regard-warnings hace que advertencias
como un JPEG truncado provoquen el fallo del comando. Un fallo puede dejar una salida parcial;
revísala antes de usar el lote. Corrige la entrada y elige un directorio de salida nuevo para otra
ejecución.
La opción de nombre de archivo literal evita que
nombres de salida como photo%03d.png se conviertan en photo000.png. Entrecomillar los argumentos del shell
por sí solo no desactiva el formateo de nombres de archivo de ImageMagick.
La geometría de redimensionado 800x600> conserva
la relación de aspecto y solo reduce las imágenes que superan el recuadro. Entrecomíllala para que
Bash no interprete > como redirección de salida. Para limitar solo el ancho, usa '800x>' en su lugar.
| Dimensiones de entrada | Dimensiones de salida con 800x600> |
|---|---|
| 1600 × 900 | 800 × 450 |
| 1200 × 1600 | 450 × 600 |
| 320 × 240 | 320 × 240 |
Comprueba lo que se escribió:
magick identify -format '%f: %m %wx%h\n' ./resized_png/*.png
Por ejemplo, un wide.jpg de 1600 × 900 produce wide.png: PNG 800x450. El recuadro delimitador es un límite,
así que la salida no tiene por qué medir exactamente 800 × 600.
Automatiza carpetas anidadas
Un find recursivo seguido de mogrify -path aplanaría el árbol de directorios: trip/photo.jpg
y work/photo.jpg podrían sobrescribirse entre sí. Este script conserva los subdirectorios y añade
.png al nombre de archivo de origen completo, de modo que photo.jpg y photo.jpeg también se mantienen distintos.
Guarda esto como un archivo nuevo llamado process_images.sh junto a input_images. Mantén el directorio de salida
fuera del árbol de entrada. No debe existir todavía.
#!/usr/bin/env bash
set -euo pipefail
INPUT_DIR="input_images"
OUTPUT_DIR="output_images"
if [[ ! -d "$INPUT_DIR" ]]; then
printf 'Input directory not found: %s\n' "$INPUT_DIR" >&2
exit 1
fi
mkdir "$OUTPUT_DIR"
find "$INPUT_DIR" -type f \( -iname '*.jpg' -o -iname '*.jpeg' \) -print0 |
(
found=false
while IFS= read -r -d '' file; do
found=true
relative=${file#"$INPUT_DIR"/}
output="$OUTPUT_DIR/$relative.png"
mkdir -p "${output%/*}"
# Capture diagnostics separately from PNG bytes; warnings also reject the image.
if ! diagnostics=$(magick -regard-warnings jpeg:- -auto-orient -resize '800x600>' png:- \
< "$file" 2>&1 > "$output") || [[ -n "$diagnostics" ]]; then
rm -f "$output"
printf 'Could not convert: %s\n%s\n' "$file" "$diagnostics" >&2
exit 1
fi
done
if [[ "$found" == false ]]; then
printf 'No JPEG files found in %s\n' "$INPUT_DIR" >&2
exit 1
fi
)
printf 'Images have been resized and converted into %s\n' "$OUTPUT_DIR"
Ejecútalo desde el directorio que contiene el script y input_images:
bash process_images.sh
Por ejemplo, input_images/trip/photo.jpg se convierte en output_images/trip/photo.jpg.png.
El script acepta .jpg y .jpeg en cualquier combinación de mayúsculas y minúsculas. find -print0 y read -d '' conservan
los espacios y los saltos de línea, mientras que la redirección del shell mantiene literales nombres
como -cover.jpg y photo%03d.jpg tanto en la entrada como en la salida. Los
flujos estándar de ImageMagick transportan los bytes JPEG y PNG.
El script comprueba los diagnósticos de la conversión además del estado de salida, así que rechaza
un JPEG truncado aunque ImageMagick solo imprima una advertencia. Informa de que ha terminado solo
después de que todo el pipeline se complete correctamente. pipefail también detecta un directorio
ilegible que informe find. Un directorio de entrada inexistente, la ausencia de JPEG coincidentes
o una conversión fallida devuelven un estado distinto de cero. Se elimina la salida de la imagen que
falló; las salidas correctas anteriores se conservan. Revisa un lote fallido y elige un
OUTPUT_DIR nuevo antes de volver a intentarlo. Usa este flujo de trabajo para lotes locales de imágenes
JPEG estáticas normales.
Adapta la salida para tu sitio web
Estos dos comandos opcionales usan la misma carpeta plana input_images del primer ejemplo. Cada uno
requiere su propio destino nuevo y no toca los originales. Un comando fallido puede dejar un lote
parcial, igual que con resized_png.
Crear miniaturas
Para miniaturas cuadradas, rellena el cuadrado con '150x150^' y luego recorta desde el centro con
-gravity center -extent 150x150. Esto puede ampliar imágenes pequeñas y recortar los motivos que estén cerca de un borde:
mkdir thumbnails &&
magick mogrify -regard-warnings -define registry:filename:literal=true \
-auto-orient -resize '150x150^' -gravity center -extent 150x150 \
-format jpg -path thumbnails ./input_images/*.jpg
Optimizar imágenes para la web
Para mantener las fotografías como JPEG, combina el recuadro delimitador con un ajuste de calidad JPEG:
mkdir optimized &&
magick mogrify -regard-warnings -define registry:filename:literal=true \
-auto-orient -resize '800x600>' -quality 85 -path optimized ./input_images/*.jpg
-quality 85 es un ajuste del codificador en la
escala de calidad JPEG, no una promesa del 85 % de calidad visual ni de una reducción concreta del
tamaño de archivo. Volver a codificar JPEG es un proceso con pérdida. Compara los bytes y el aspecto
resultantes con los de tus originales antes de elegir un ajuste; un archivo de origen que ya esté
muy comprimido puede acabar siendo más grande.
Si la salida se ve mal, revisa primero los metadatos de orientación y después confirma si querías un recuadro delimitador o un recorte cuadrado. Si un comando se niega a ejecutarse de nuevo, revisa su destino: estos ejemplos exigen deliberadamente un directorio de salida nuevo para proteger el resultado anterior.
