Bildcollagen mit der ImageMagick-CLI erstellen
Übergeben Sie ImageMagick eine explizite Bildliste, um eine Collage in vorhersehbarer Reihenfolge zu erstellen. Das folgende Bash-Skript erstellt ein PNG-Raster, lässt Ihre Quelldateien unverändert und liest nur die aufgelisteten Dateien. Es lehnt außerdem ein bereits vorhandenes Ziel ab, sodass auch eine erneute Ausführung keine Collage ersetzen kann.
ImageMagick einrichten
Verwenden Sie Linux mit Bash und einer ImageMagick-7-Installation, die JPEG und PNG unterstützt. Diese Anleitung wurde mit GNU Bash 5.3.15 und ImageMagick 7.1.2-31 Q16-HDRI getestet. ImageMagick 6 und andere Betriebssysteme liegen außerhalb des für dieses Beispiel getesteten Umfangs.
Fügen Sie die Befehlsblöcke in eine Bash-Shell ein, in der errexit deaktiviert ist,
sodass Sie nach einem fehlgeschlagenen Befehl wieder zur Eingabeaufforderung gelangen. Das unten
zum Speichern bereitgestellte Skript legt seine eigene Fehlerbehandlung fest.
Prüfen Sie, ob die Werkzeuge über Ihren PATH erreichbar sind:
bash --version && magick --version
Ressourcenlimits konfigurieren
Behalten Sie die bestehende Sicherheitsrichtlinie Ihrer Installation bei. Für diese kleinen Beispiele ist keine globale Richtlinienänderung nötig. Die aktuellen Limits können Sie so einsehen:
magick -list resource
Größere Bilder können die konfigurierten Limits auch dann erreichen, wenn ihre Thumbnails klein sind, da zuerst decodiert wird. Verwenden Sie weniger oder kleinere Quellbilder, bevor Sie eine Richtlinie ändern. Die Dokumentation zu Ressourcenrichtlinien von ImageMagick erläutert die Einstellungen.
Bilder vorbereiten
Beginnen Sie in einem beschreibbaren Verzeichnis. Dieser Block erstellt ein neues Verzeichnis
namens collage-demo mit drei Beispiel-JPEGs und einem separaten Ausgabeverzeichnis.
Er schlägt fehl, wenn collage-demo bereits existiert, und belässt Ihre Shell im
ursprünglichen Verzeichnis:
(
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
)
Speichern Sie das folgende Skript als collage-demo/make-collage.sh. Als Argumente erhält es ein
neues Ziel mit der Endung .png, gefolgt von einer oder mehreren lokalen
JPEG- oder PNG-Dateien mit Standbildern. Setzen Sie jeden Pfad in Anführungszeichen und listen Sie
die Dateien in der gewünschten Anzeigereihenfolge auf. Verwenden Sie *.jpg
nicht in einem Verzeichnis mit generierten Bildern: Die Shell würde diese Bilder ebenfalls aufnehmen.
ImageMagick hat eine eigene Dateinamensyntax, einschließlich Platzhaltern und Frame-Selektoren. Anführungszeichen in der Shell allein deaktivieren diese nicht. Das Skript kopiert jede Eingabe vor dem Decodieren in eine temporäre Datei mit einem gewöhnlichen Namen und kopiert anschließend das fertige PNG an Ihr wörtlich angegebenes Ziel. Damit werden auch Pfade mit Leerzeichen, eckigen Klammern oder Prozentzeichen verarbeitet.
#!/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"
Jedes Bild wird ohne Zuschneiden oder Verzerren in eine Kachel im Format 200×200 eingepasst; der verbleibende Bereich wird weiß aufgefüllt. Transparenz wird mit Weiß als Hintergrund verrechnet, auch bei teilweise transparenten Pixeln. Das Skript wendet vor der Größenänderung die Ausrichtungsmetadaten an und konvertiert die Farben vor dem Compositing nach sRGB. Dies ist eine allgemeine Konvertierung. Wenn eine genaue Farbabstimmung wichtig ist, insbesondere bei CMYK-Bildern oder Bildern mit ICC-Profil, verwenden Sie einen geeigneten Workflow mit Farbprofilen.
Verwenden Sie vollständige lokale Bilder, denen Sie vertrauen.
-regard-warnings
behandelt einige Warnungen beim Decodieren als Fehler; die Bildintegrität wird damit nicht validiert.
Im getesteten Build erzeugte ein JPEG mit abgeschnittenen Nutzdaten dennoch eine Collage und
meldete Erfolg, obwohl nahe dem unteren Rand seiner Kachel fehlerhafte Pixel auftraten. Prüfen Sie
die Eingabe und die gesamte erzeugte Kachel, wenn Beschädigungen möglich sind. Enthält eine Eingabe
eine Sequenz, wird nur der erste Frame verwendet.
Eine Collage mit montage erstellen
Führen Sie im Verzeichnis mit collage-demo Folgendes aus:
(
cd collage-demo &&
bash make-collage.sh collages/example.png \
photos/red.jpg photos/green.jpg photos/blue.jpg
)
Öffnen Sie collage-demo/collages/example.png. Das Bild sollte 612×204 Pixel groß sein, mit roten,
grünen und blauen Kacheln von links nach rechts. Das Bild im Querformat hat oben und unten weiße
Ränder, das Bild im Hochformat an den Seiten. Um jede Kachel liegen 2 Pixel Freiraum, sodass
zwischen benachbarten Kacheln ein Abstand von 4 Pixeln entsteht. Prüfen Sie bei echten Fotos jede
Kachel einschließlich ihrer Ränder.
Eine Wiederholung dieses Befehls schlägt mit „Refusing existing output“ fehl und lässt das PNG unverändert. Wählen Sie ein neues Ziel, um eine weitere Collage zu erstellen. Das Skript kopiert das Ergebnis erst, nachdem jede Kachel und die Montage erfolgreich erstellt wurden. Ein Dateisystemfehler beim abschließenden Kopieren kann dennoch eine unvollständige Ausgabe hinterlassen. Führen Sie Aufträge nacheinander aus: Die Prüfung auf ein vorhandenes Ziel schützt nicht vor gleichzeitigen Schreibzugriffen auf dasselbe Ziel. Lassen Sie die Quelldateien während eines Auftrags unverändert.
Layout anpassen
Die Optionen für montage im Skript steuern
das Raster. -tile 3x reserviert drei Spalten und verwendet so viele Zeilen
wie nötig. -geometry 200x200+2+2 verwendet die vorbereiteten Kacheln im Format 200×200
mit 2 Pixeln Freiraum ringsum. Vier Eingaben ergeben ein Bild im Format 612×408; die ungenutzten
Zellen der letzten Zeile sind weiß. Auch bei einer oder zwei Eingaben bleiben drei Spalten
reserviert. Wenn Sie die Thumbnail-Größe ändern, halten Sie -thumbnail,
-extent und die Größe in -geometry konsistent.
Stapelverarbeitung mit Fehlerbehandlung
Dieser Block erstellt zwei Collagen aus explizit ausgewählten Eingabedateien. Er fährt nach einem fehlgeschlagenen Auftrag fort und gibt einen Status ungleich null zurück, wenn einer der beiden Aufträge fehlschlägt, auch wenn der letzte erfolgreich ist:
(
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"
)
Fehlende und leere Eingabedateien sowie Dateien, die Decodierfehler auslösen, lassen den jeweiligen Auftrag fehlschlagen; die Fehlermeldung nennt den ausgewählten Pfad. Für behebbare Beschädigungen gilt die oben beschriebene Einschränkung. Werden keine Eingabepfade übergeben, erscheint ein Verwendungshinweis. Vorhandene Ausgaben zählen ebenfalls als fehlgeschlagene Aufträge; die Ergebnisse erfolgreicher Aufträge bleiben verfügbar.
Fehlerbehebung
Wenn magick fehlt, prüfen Sie, ob Version 7 installiert ist und ob das
Verzeichnis mit der ausführbaren Datei in PATH enthalten ist. Fehlt ein
JPEG- oder PNG-Decoder, benötigen Sie einen Build, in dem das entsprechende Format aktiviert ist.
Die Installation von Header-Paketen allein fügt einer vorhandenen Binärdatei keinen Decoder hinzu.
Lesen Sie bei einer fehlgeschlagenen Eingabe die Diagnosemeldung mit dem ursprünglichen Pfad und prüfen Sie dann diese Datei. Reduzieren Sie bei einem Fehler aufgrund der Ressourcenrichtlinie die Arbeitslast und ziehen Sie die Richtlinie Ihrer Installation heran. Wenn das abschließende Kopieren fehlschlägt, prüfen Sie, ob das Ausgabeverzeichnis existiert und beschreibbar ist, bevor Sie es mit einem neuen Ziel versuchen. Das Skript erstellt kein Ausgabeverzeichnis automatisch.
Ersetzen Sie die Beispielpfade durch Ihre eigene Bildliste, sobald die Demonstration funktioniert. Geben Sie die Eingabereihenfolge weiterhin explizit an und wählen Sie für jede Collage ein neues PNG-Ziel.
