Remote-Bilder mit cURL und ImageMagick zusammensetzen
Einen heruntergeladenen Hintergrund mit einem Overlay zu kombinieren, ist nützlich für Berichte, Dashboards und generierte Vorschauen. Dieses Beispiel setzt NASA-Bildmaterial zusammen; es ist keine Integration von Live-Wetterdaten. Dieselbe Verarbeitungsstruktur lässt sich mit einem Wetteranbieter nutzen, sobald dessen Bild-URLs, Lizenzierung und Aktualisierungsanforderungen geprüft sind.
Versionskompatibilität
Verwenden Sie Bash, ImageMagick 7 mit dem Befehl magick sowie cURL 8.4 oder neuer. Die cURL-Anforderung
ist wichtig, weil das Limit für die Downloadgröße auch Antworten ohne bekannte Inhaltslänge stoppen
muss. Setzen Sie sowohl für Downloads als auch für das Decodieren von Bildern aktiv gepflegte
Versionen ein.
Überblick
Eine zuverlässige Pipeline muss die Downloads prüfen, die sie tatsächlich verarbeitet, statt eine URL einmal testweise abzurufen und sie danach ungeprüft erneut abzurufen. Das Skript lädt jede Quelle in ein privates Job-Verzeichnis herunter, setzt das Bild zusammen und entfernt die temporären Eingaben. Ein neues Ausgabeverzeichnis verhindert Kollisionen mit früheren Ergebnissen.
Die Pipeline einrichten
Das Beispiel verwendet ein Foto der Mondlandung und ein NASA-Logo von URLs, die bei der NASA gehostet werden. Beachten Sie die Richtlinien der NASA zur Nutzung von Bildern und Medien, einschließlich der Beschränkungen für die Verwendung ihres Emblems; diese Beispiel-Assets stellen keine Befürwortung dar.
Voraussetzungen für Prozesssubstitution
Prozesssubstitution wie <(curl ...) ist ein Bash-Feature und keine Anforderung der POSIX-Shell. Wichtiger
noch: Ein fehlgeschlagener Download im Hintergrund wird nicht automatisch zum Exit-Status des
Bildbefehls. Diese Implementierung verwendet explizit geprüfte Downloads statt Prozesssubstitution.
Bilder im laufenden Betrieb abrufen und zusammensetzen
Speichern Sie Folgendes als compose.sh. Übergeben Sie zwei vertrauenswürdige HTTPS-URLs und ein neues Ausgabeverzeichnis:
#!/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
[[ $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"
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
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
[ -s result.jpg ] || { echo "No image produced" >&2; exit 1; }
echo "Composite saved: $output_dir/result.jpg"
Führen Sie es mit einem neuen Speicherort für die Ausgabe aus:
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
Ein abgeschlossener Job enthält result.jpg. Fehlgeschlagene Downloads oder Decodiervorgänge geben einen
Exit-Status ungleich null zurück und entfernen nur die unvollständigen Dateien des jeweiligen Jobs.
Lassen Sie keine anderen Prozesse in dieses Verzeichnis schreiben, während der Job läuft.
Hinweise zum Arbeitsspeicher
Aus einer kleinen komprimierten Datei kann beim Decodieren ein großes Bild entstehen. Das Skript begrenzt die heruntergeladenen Bytes, die Abmessungen des decodierten Bildes und die Cache-Ressourcen von ImageMagick, doch diese Einstellungen sind keine vollständige Begrenzung von Prozessspeicher oder Ausführungszeit. ImageMagick kann temporären Speicherplatz auf der Festplatte für Pixel-Caches nutzen. Konfigurieren Sie dessen Sicherheitsrichtlinie und erzwingen Sie für Produktions-Worker Limits des Betriebssystems für Arbeitsspeicher, Festplatte und Zeit.
Sicherheitshinweise
Verwenden Sie bekannte, vertrauenswürdige Bildquellen. Eine ausschließlich über HTTPS laufende Übertragung und die Zertifikatsprüfung verhindern kein SSRF: Eine beliebige URL oder Weiterleitung kann weiterhin auf einen Dienst im privaten Netzwerk zeigen. Eine öffentliche API für Uploads oder URL-Verarbeitung benötigt eine eigene Ursprungsrichtlinie, eine Prüfung von Weiterleitungen, Kontrollen für ausgehenden Netzwerkverkehr und Authentifizierung. Stellen Sie dieses Shell-Skript nicht als uneingeschränkten URL-Abrufdienst bereit.
Deaktivieren Sie weder die TLS-Prüfung noch die Prüfung auf Zertifikatssperrung, um einen
fehlschlagenden Download durchzubekommen. Halten Sie cURL-Konfiguration und Zugangsdaten aus diesem
Worker heraus; --disable verhindert, dass die Standardkonfigurationsdatei von curl automatisch geladen
wird.
Anwendungen in der Praxis
Diese Struktur kann Dashboard-Bilder, Event-Overlays oder Illustrationen für Berichte zusammensetzen. Prüfen Sie für jeden Workflow die tatsächliche vorgelagerte Datenquelle, die Aktualisierungsrichtlinie, die Bildabmessungen und die Nutzungsrechte. Das NASA-Beispiel demonstriert das Zusammensetzen von Bildern, keine Wettervorhersage und keinen Latenz-Benchmark.
Fehlerbehandlung und Optimierung
Die einzige Hilfsfunktion fetch_image steuert die Download-Optionen und die Wiederholungsrichtlinie für
beide Quellen. Wiederholungsversuche sind begrenzt und gelten für Fehler, die cURL wiederholen kann.
Ein 404-Fehler oder ein ungültiges Bild muss sichtbar fehlschlagen und darf nicht als leeres, aber
erfolgreiches Overlay behandelt werden. Prüfen Sie den Exit-Status des Skripts, bevor Sie dessen
Ergebnis veröffentlichen.
Das Zwischenspeichern geprüfter Eingaben kann wiederholte Downloads reduzieren. Validieren Sie Aktualität und Integrität des Caches ausdrücklich; fügen Sie nach einer erfolgreichen Prüfung keinen zweiten, ungeprüften Abruf hinzu.
Fazit
cURL und ImageMagick bilden eine nützliche Automatisierungs-Pipeline, wenn die tatsächlichen Übertragungen, das Ergebnis des Decoders und die Eigentümerschaft der Ausgabe geprüft werden. Verwenden Sie eine einzige Download-Richtlinie wieder, halten Sie Zwischendateien privat und prüfen Sie das zusammengesetzte Bild, bevor Sie es veröffentlichen.
Für verwaltete Bild-Workflows entdecken Sie den Service zur Bildverarbeitung von Transloadit.
