Créer des collages d’images avec ImageMagick CLI
Transmettez à ImageMagick une liste explicite d’images pour créer un collage dans un ordre prévisible. Le script Bash ci-dessous crée une grille PNG, laisse vos fichiers source intacts et ne lit que les fichiers que vous indiquez. Il refuse aussi une destination existante : une nouvelle exécution ne peut donc pas remplacer un collage.
Mettre en place ImageMagick
Utilisez Linux avec Bash et une installation d’ImageMagick 7 prenant en charge JPEG et PNG. Ce guide a été testé avec GNU Bash 5.3.15 et ImageMagick 7.1.2-31 Q16-HDRI. ImageMagick 6 et les autres systèmes d’exploitation sortent du périmètre testé de cet exemple.
Collez les blocs de commandes dans un shell Bash où errexit est désactivé, afin qu’une commande en
échec vous rende la main à l’invite. Le script enregistré ci-dessous définit sa propre gestion des
erreurs.
Vérifiez que les outils se trouvent dans votre PATH :
bash --version && magick --version
Configurer les limites de ressources
Conservez la politique de sécurité existante de votre installation. Ces petits exemples ne nécessitent aucune modification globale de la politique. Vous pouvez consulter les limites actuelles avec :
magick -list resource
Des images plus grandes peuvent tout de même atteindre les limites configurées, même lorsque leurs miniatures sont petites, car le décodage a lieu en premier. Utilisez moins d’images source, ou des images plus petites, avant de modifier une politique. La documentation sur la politique de ressources d’ImageMagick explique ces réglages.
Préparer vos images
Commencez dans un répertoire accessible en écriture. Ce bloc crée un nouveau répertoire collage-demo
contenant trois exemples de fichiers JPEG, ainsi qu’un répertoire de sortie distinct. Il échoue si
collage-demo existe déjà et laisse votre shell dans son répertoire d’origine :
(
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
)
Enregistrez le script suivant sous le nom collage-demo/make-collage.sh. Ses arguments sont une nouvelle destination
.png suivie d’un ou plusieurs fichiers JPEG ou PNG locaux et statiques. Mettez chaque chemin
entre guillemets et indiquez les fichiers dans l’ordre où vous voulez qu’ils apparaissent.
N’utilisez pas *.jpg dans un répertoire contenant des images générées : le shell inclurait
aussi ces images.
ImageMagick possède sa propre syntaxe de noms de fichiers, qui inclut des caractères génériques et des sélecteurs de trames. Les guillemets du shell ne suffisent pas à la désactiver. Le script copie chaque entrée vers un nom de fichier temporaire ordinaire avant le décodage, puis copie le PNG terminé vers votre destination littérale. Cela gère aussi les chemins contenant des espaces, des crochets ou des signes de pourcentage.
#!/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"
Chaque image s’inscrit dans une tuile de 200×200 sans recadrage ni étirement ; un remplissage blanc occupe la zone restante. La transparence est composée sur du blanc, y compris pour les pixels partiellement transparents. Le script applique les métadonnées d’orientation avant le redimensionnement et convertit les couleurs en sRGB avant la composition. Il s’agit d’une conversion générique. Lorsqu’une correspondance précise des couleurs compte, en particulier pour les images CMYK ou dotées d’un profil ICC, utilisez un flux de gestion des profils colorimétriques adapté.
Utilisez des images locales complètes et dignes de confiance. -regard-warnings
traite certains avertissements de décodage comme des erreurs ; il ne valide pas l’intégrité des
images. Avec le binaire testé, un JPEG dont les données étaient tronquées a tout de même produit un
collage et renvoyé un succès, avec des pixels incorrects près du bas de sa tuile. Vérifiez l’entrée
et l’intégralité de la tuile obtenue lorsqu’un endommagement est possible. Seule la première trame
est utilisée si une entrée contient une séquence.
Créer un collage avec montage
Depuis le répertoire contenant collage-demo, exécutez :
(
cd collage-demo &&
bash make-collage.sh collages/example.png \
photos/red.jpg photos/green.jpg photos/blue.jpg
)
Ouvrez collage-demo/collages/example.png. Le fichier devrait mesurer 612×204 pixels, avec des tuiles rouge, verte et
bleue de gauche à droite. L’image au format paysage a un remplissage blanc au-dessus et en dessous ;
l’image au format portrait a un remplissage sur ses côtés. Chaque tuile est entourée de 2 pixels,
ce qui donne un écart de 4 pixels entre tuiles voisines. Vérifiez chaque tuile, bords compris,
lorsque vous utilisez de vraies photographies.
Relancer cette commande échoue avec « Refusing existing output » et laisse ce PNG inchangé. Choisissez une nouvelle destination pour créer un autre collage. Le script ne copie le résultat qu’une fois que chaque tuile et le montage ont réussi ; une erreur du système de fichiers pendant cette copie finale peut tout de même laisser une sortie partielle. Exécutez les tâches l’une après l’autre : la vérification d’existence ne protège pas contre des écritures concurrentes vers la même destination. Ne modifiez pas les fichiers source pendant l’exécution d’une tâche.
Personnaliser la disposition
Les options montage du script contrôlent la grille. -tile 3x
réserve trois colonnes et utilise autant de lignes que nécessaire. -geometry 200x200+2+2 utilise les tuiles
préparées de 200×200 avec 2 pixels d’espace autour. Quatre entrées produisent une image de
612×408 ; les cellules inutilisées de la dernière ligne sont blanches. Avec une ou deux entrées,
trois colonnes sont tout de même réservées. Pour changer la taille des miniatures, gardez
-thumbnail, -extent et la taille indiquée dans -geometry cohérents.
Traitement par lot avec gestion des erreurs
Ce bloc crée deux collages à partir d’ensembles d’entrées choisis explicitement. Il continue après une tâche en échec et renvoie un statut non nul si l’une des tâches échoue, même lorsque la dernière réussit :
(
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"
)
Les fichiers d’entrée manquants ou vides, ainsi que les fichiers qui provoquent des erreurs de décodage, font échouer leur tâche, et l’erreur indique le chemin sélectionné. Les dommages récupérables présentent la limite décrite plus haut. Sans chemin d’entrée, le script affiche le message d’utilisation. Les sorties existantes comptent aussi comme des tâches en échec ; les tâches réussies restent disponibles.
Dépannage
Si magick est introuvable, vérifiez que vous avez installé la version 7 et que son répertoire
d’exécutables figure dans PATH. Un décodeur JPEG ou PNG manquant nécessite une version compilée
avec ce format activé ; installer uniquement des paquets d’en-têtes n’ajoute pas de décodeur à un
binaire existant.
Pour une entrée en échec, lisez le diagnostic contenant son chemin d’origine, puis examinez ce fichier. Pour une erreur de politique de ressources, réduisez la charge de travail et consultez la politique de votre installation. Pour une copie finale en échec, vérifiez que le répertoire de sortie existe et est accessible en écriture avant d’essayer une nouvelle destination. Le script ne crée aucun répertoire de sortie automatiquement.
Remplacez les chemins d’exemple par votre propre liste d’images une fois la démonstration fonctionnelle. Gardez l’ordre des entrées explicite et choisissez une nouvelle destination PNG pour chaque collage.
