Redimensionner et convertir des images en lot avec ImageMagick
Utilisez ImageMagick pour faire tenir des JPEG dans un cadre de 800 × 600 et enregistrer des copies PNG tout en conservant les originaux. Commencez par un dossier sans sous-dossiers, puis utilisez le script Bash ci-dessous pour traiter des dossiers imbriqués sans perdre les fichiers qui portent le même nom. Chaque exemple crée un nouveau répertoire de sortie et refuse de le réutiliser.
Le PNG est utile lorsque l’étape suivante de votre chaîne de traitement requiert un stockage d’images sans perte. Convertir un JPEG en PNG ne récupère pas les détails déjà perdus par la compression JPEG et ne garantit pas un fichier plus petit. Si votre objectif est d’alléger des photographies pour un site web, consultez la recette JPEG.
Mettre en place ImageMagick 7
Ces exemples nécessitent Bash, find et ImageMagick 7 avec prise en charge de JPEG et PNG. Ils ont été
testés sous macOS avec ImageMagick 7.1.2-31 et Bash 3.2.57 et 5.3.20. Exécutez les blocs de
commandes dans Bash, car le Terminal de macOS peut sinon lancer un autre shell.
Si Homebrew est installé, suivez les instructions d’installation d’ImageMagick pour macOS :
brew install imagemagick
Sous Linux, vérifiez la version proposée par votre distribution avant l’installation. Par exemple,
le paquet imagemagick d’Ubuntu 24.04 fournit la version 6.
Ces commandes nécessitent la version 7 ; consultez les téléchargements officiels
si votre paquet ne la fournit pas.
ImageMagick dispose aussi d’un programme d’installation pour Windows, mais ce guide ne couvre ni PowerShell ni l’invite de commandes. Une installation Windows seule ne fournit pas l’environnement Bash utilisé ici.
Vérifiez la version installée et les formats disponibles :
magick -version && magick -list format
Repérez ImageMagick 7 dans la ligne de version et rw dans la colonne de mode pour JPEG et PNG.
Si magick est absent, corrigez l’installation ou le PATH avant de continuer.
Redimensionner et convertir un dossier sans sous-dossiers
Dans votre répertoire de travail, créez un dossier d’entrée et placez-y quelques JPEG. Cette commande de préparation accepte aussi un répertoire d’entrée existant et ne modifie pas son contenu :
mkdir -p input_images
Les commandes courtes traitent les fichiers .jpg non masqués et en minuscules situés directement dans input_images.
Pour des dossiers imbriqués, d’autres extensions JPEG ou des noms contenant des crochets ou des
caractères génériques, utilisez plutôt le script récursif.
mogrify écrase normalement ses fichiers d’entrée.
Ici, -path dirige les copies PNG vers un nouveau répertoire. Le && empêche la conversion si ce
répertoire existe déjà ou ne peut pas être créé :
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 applique l’orientation EXIF du JPEG avant le redimensionnement.
-regard-warnings fait échouer la commande en cas
d’avertissement, par exemple pour un JPEG tronqué. Un échec peut laisser une sortie partielle ;
inspectez-la avant d’utiliser le lot. Corrigez l’entrée et choisissez un nouveau répertoire de
sortie pour une autre exécution.
Le paramètre de nom de fichier littéral empêche des noms
de sortie tels que photo%03d.png de devenir photo000.png. Mettre les arguments du shell entre guillemets
ne suffit pas à désactiver la mise en forme des noms de fichiers d’ImageMagick.
La géométrie de redimensionnement 800x600> préserve
le rapport hauteur/largeur et ne réduit que les images qui dépassent le cadre. Mettez-la entre
guillemets pour que Bash n’interprète pas > comme une redirection de sortie. Pour limiter
uniquement la largeur, utilisez plutôt '800x>'.
| Dimensions d’entrée | Dimensions de sortie avec 800x600> |
|---|---|
| 1600 × 900 | 800 × 450 |
| 1200 × 1600 | 450 × 600 |
| 320 × 240 | 320 × 240 |
Vérifiez ce qui a été écrit :
magick identify -format '%f: %m %wx%h\n' ./resized_png/*.png
Par exemple, un wide.jpg de 1600 × 900 produit wide.png: PNG 800x450. Le cadre englobant est une
limite ; la sortie ne mesure donc pas nécessairement exactement 800 × 600.
Automatiser le traitement des dossiers imbriqués
Un find récursif suivi de mogrify -path aplatirait l’arborescence : trip/photo.jpg
et work/photo.jpg pourraient s’écraser mutuellement. Ce script préserve les sous-répertoires et ajoute
.png au nom complet du fichier source, ce qui garde aussi photo.jpg et photo.jpeg distincts.
Enregistrez ce script dans un nouveau fichier nommé process_images.sh à côté de input_images. Placez le
répertoire de sortie en dehors de l’arborescence d’entrée. Il ne doit pas déjà exister.
#!/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"
Exécutez-le depuis le répertoire contenant le script et input_images :
bash process_images.sh
Par exemple, input_images/trip/photo.jpg devient output_images/trip/photo.jpg.png.
Le script accepte .jpg et .jpeg quelle que soit la casse. find -print0 et read -d '' préservent
les espaces et les sauts de ligne, tandis que la redirection du shell garde littéraux les noms tels
que -cover.jpg et photo%03d.jpg, en entrée comme en sortie. Les
flux standard d’ImageMagick transportent les octets JPEG et PNG.
Le script vérifie les diagnostics de conversion en plus du code de sortie ; il rejette donc un JPEG
tronqué même si ImageMagick n’affiche qu’un avertissement. Il ne signale la fin du traitement
qu’une fois l’ensemble du pipeline réussi. pipefail détecte aussi un répertoire illisible signalé
par find. Un répertoire d’entrée manquant, l’absence de JPEG correspondants ou une conversion
échouée renvoie un code de sortie non nul. La sortie de l’image en échec est supprimée ; les
sorties réussies précédentes sont conservées. Examinez un lot en échec et choisissez un nouveau
OUTPUT_DIR avant de réessayer. Utilisez cette chaîne de traitement pour des lots locaux de
JPEG ordinaires d’images fixes.
Adapter le résultat à votre site web
Ces deux commandes facultatives utilisent le même dossier input_images sans sous-dossiers que le premier
exemple. Chacune nécessite sa propre nouvelle destination et laisse les originaux intacts. Une
commande en échec peut laisser un lot partiel, comme avec resized_png.
Créer des miniatures
Pour des miniatures carrées, remplissez le carré avec '150x150^', puis recadrez à partir du centre
avec -gravity center -extent 150x150. Cela peut agrandir les petites images et rogner des sujets proches d’un bord :
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
Optimiser les images pour le Web
Pour conserver les photographies en JPEG, combinez le cadre englobant avec un réglage de qualité 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 est un réglage de l’encodeur sur
l’échelle de qualité JPEG, et non la promesse d’une qualité visuelle de 85 % ou d’une réduction
particulière de la taille des fichiers. Réencoder des JPEG entraîne des pertes. Comparez le poids
en octets et l’apparence du résultat avec vos originaux avant de choisir un réglage ; une source
déjà fortement compressée peut devenir plus lourde.
Si le résultat semble incorrect, vérifiez d’abord les métadonnées d’orientation, puis confirmez si vous vouliez un cadre englobant ou un recadrage carré. Si une commande refuse de s’exécuter à nouveau, vérifiez sa destination : ces exemples exigent délibérément un nouveau répertoire de sortie afin de protéger le résultat précédent.
