Bilder aus dem Netz mit cURL und ImageMagick kombinieren
Laden Sie mit cURL ein Hintergrundbild und ein Overlay herunter, skalieren Sie dann beide mit ImageMagick und speichern Sie das Ergebnis als eine JPEG-Datei. Das folgende Bash-Skript prüft beide HTTPS-Transfers und entfernt seine unvollständigen Dateien, wenn ein Download oder ein Schritt der Bildverarbeitung fehlschlägt.
Werkzeuge prüfen
Dieses Beispiel wurde unter Linux mit Bash 5.3.15, cURL 8.22.0 und ImageMagick 7.1.2-31 mit
Unterstützung für JPEG und PNG getestet. Dies sind getestete Versionen, keine zwingend erforderlichen
Patch-Versionen. Verwenden Sie gepflegte Builds von
cURL und ImageMagick 7.
Der cURL-Build muss mindestens 8.4 sein: Frühere Versionen können
--max-filesize nicht durchsetzen, wenn die Antwortgröße unbekannt ist.
Prüfen Sie bash --version, curl --disable --version und
magick -version, bevor Sie das Skript speichern.
Verwenden Sie RGB-Einzelbilder mit einem undurchsichtigen Hintergrund; das PNG-Overlay darf
Transparenz enthalten. Das Beispiel verwendet ein JPEG-Foto und ein PNG-Logo der NASA. Beachten Sie die
NASA-Richtlinien zur Nutzung von Bildern und Medien,
einschließlich der Einschränkungen für das Emblem und für Werbeempfehlungen.
Skript zum Kombinieren speichern
Jede Quelle wird in ein neues privates Verzeichnis heruntergeladen. Eine direkte Übergabe von
<(curl ...) an ImageMagick würde es erschweren, den Exit-Status des Transfers für
das Hintergrundbild zu prüfen. Das Speichern und Prüfen der tatsächlichen Eingaben verhindert
außerdem, dass eine URL mit einer Anfrage getestet und eine zweite, ungeprüfte Antwort verarbeitet
wird.
Speichern Sie dies als compose.sh. Das Skript erwartet zwei vertrauenswürdige
HTTPS-URLs und ein neues Ausgabeverzeichnis, dessen übergeordnetes Verzeichnis bereits existiert:
#!/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
if ! command -v curl >/dev/null || ! command -v magick >/dev/null; then
echo "Install cURL and ImageMagick 7 before running this script" >&2
exit 1
fi
[[ $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" "$output_dir/magick.log"
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
if ! 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 2>magick.log ||
[ -s magick.log ]; then
cat magick.log >&2
echo "ImageMagick reported a failure or diagnostic" >&2
exit 1
fi
[ -s result.jpg ] || { echo "No image produced" >&2; exit 1; }
echo "Composite saved: $output_dir/result.jpg"
Beispiel ausführen
Führen Sie das gespeicherte Skript im Verzeichnis aus, das compose.sh
enthält:
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
Öffnen Sie nasa-composite/result.jpg: Das Bild sollte das Mondlandungsfoto mit dem NASA-Logo in
der rechten unteren Ecke zeigen. Das weiße Rechteck des Logos stammt aus der PNG-Quelldatei.
Das Hintergrundbild wird auf höchstens 1600 × 1600 Pixel skaliert, das Overlay auf höchstens
300 × 300. Die Seitenverhältnisse bleiben erhalten. Das in Anführungszeichen gesetzte
> in jeder
Geometrie für die Größenänderung verhindert eine Vergrößerung.
-gravity southeast -geometry +20+20 platziert die Bildfläche des Overlays 20 Pixel vom rechten und unteren
Rand entfernt. Wenn Sie kleinere Bilder verwenden, lassen Sie genug Platz für das Overlay und beide
Randabstände; das Skript verkleinert ein zu großes Overlay nicht, um es in das Hintergrundbild
einzupassen.
Ein erfolgreicher Job gibt Composite saved: gefolgt vom absoluten Pfad aus und lässt nur
result.jpg im neuen Verzeichnis zurück. Wenn Sie das Skript mit demselben Verzeichnis
erneut ausführen, schlägt es fehl, bevor etwas heruntergeladen wird, und bewahrt das vorherige
Ergebnis. Halten Sie andere Prozesse vom Job-Verzeichnis fern, solange das Skript läuft.
Fehler und Retries behandeln
HTTP-Fehler, Transfers mit mehr als 10 MiB pro Quelle und nicht decodierbare Bilder führen zu einem Exit-Status ungleich null; das neue Job-Verzeichnis wird entfernt. Korrigieren Sie die URL oder die Eingabe und versuchen Sie es erneut mit demselben Verzeichnisnamen. Ein vorhandenes Verzeichnis oder ein fehlendes übergeordnetes Verzeichnis bedeutet einen Fehler bei der Einrichtung; das Skript lässt vorhandene Dateien und Verzeichnisse unverändert.
Ein abgebrochener Transfer kann kurzzeitig mehr Daten schreiben, als das Limit erlaubt; beim Aufräumen wird diese temporäre Datei entfernt.
ImageMagick kann Pixel aus einem beschädigten JPEG wiederherstellen, dabei Warnungen ausgeben und trotzdem einen Erfolgsstatus zurückgeben. Hier lässt jede Diagnosemeldung auf stderr den Job ebenfalls fehlschlagen; sie wird ausgegeben und löst die Bereinigung aus. Damit führen bewusst sowohl Warnungen als auch Fehler zum Abbruch. Das Skript kann Schäden, die ein Decoder stillschweigend akzeptiert, nicht erkennen. Prüfen Sie daher das fertige Bild, bevor Sie es veröffentlichen.
Der Download-Helfer erlaubt drei HTTPS-Weiterleitungen und zwei Retries bei Fehlern, für die cURL erneute Versuche unterstützt. Jeder Versuch hat ein Timeout von 30 Sekunden. Das Retry-Zeitfenster von 60 Sekunden steuert, ob ein weiterer Versuch startet; ein bereits laufender Versuch kann nach Ablauf dieses Zeitfensters enden.
Grenzen für vertrauenswürdige Eingaben setzen
Eine kleine komprimierte Datei kann zu einem großen Bild decodiert werden. Das Skript begrenzt die Eingabeabmessungen und die Ressourcen des Pixelcaches von ImageMagick. Der Cache kann auf die Festplatte ausweichen. Diese Einstellungen begrenzen weder den gesamten Prozessspeicher noch die Verarbeitungszeit. Verwenden Sie die Sicherheitsrichtlinie von ImageMagick und Limits des Betriebssystems, wenn Sie Worker im Produktivbetrieb ausführen.
Auch auf HTTPS beschränkte Anfragen erlauben URLs und Weiterleitungen zu Diensten in privaten
Netzwerken. Nutzen Sie vertrauenswürdige Quellen; ein uneingeschränkter öffentlicher URL-Abrufdienst
braucht separate Kontrollen für Netzwerk und Ursprung. Lassen Sie die TLS-Verifizierung aktiviert.
Wenn --disable an erster Stelle steht, verhindert es, dass cURL eine
Standardkonfigurationsdatei lädt, die diese Download-Optionen ändern könnte.
Entdecken Sie für verwaltete Workflows zur Größenänderung und zum Kombinieren von Bildern den Dienst zur Bildverarbeitung von Transloadit.
