Bilder mit ImageMagick automatisch skalieren und konvertieren
Mit ImageMagick passen Sie JPEGs in eine Box von 800 × 600 ein und speichern PNG-Kopien, während die Originale erhalten bleiben. Beginnen Sie mit einem flachen Ordner und verarbeiten Sie anschließend mit dem Bash-Skript weiter unten verschachtelte Ordner, ohne Dateien mit gleichem Namen zu verlieren. Jedes Beispiel legt ein neues Ausgabeverzeichnis an und verweigert dessen Wiederverwendung.
PNG ist nützlich, wenn der nächste Schritt in Ihrem Workflow eine verlustfreie Bildspeicherung benötigt. Die Umwandlung eines JPEG in PNG stellt keine Details wieder her, die bereits durch die JPEG-Kompression verloren gegangen sind, und garantiert auch keine kleinere Datei. Wenn Sie kleinere Fotos für eine Website anstreben, lesen Sie das JPEG-Rezept.
ImageMagick 7 einrichten
Diese Beispiele setzen Bash, find und ImageMagick 7 mit JPEG- und PNG-Unterstützung voraus. Getestet
wurden sie unter macOS mit ImageMagick 7.1.2-31 sowie Bash 3.2.57 und 5.3.20. Führen Sie die
Befehlsblöcke in Bash aus; das Terminal unter macOS startet sonst möglicherweise eine andere Shell.
Wenn Homebrew installiert ist, folgen Sie der macOS-Installationsanleitung von ImageMagick:
brew install imagemagick
Prüfen Sie unter Linux vor der Installation die Version Ihrer Distribution. Zum Beispiel liefert das
Paket imagemagick von Ubuntu 24.04 Version 6.
Diese Befehle erfordern Version 7; ziehen Sie die offiziellen Downloads
zurate, wenn Ihr Paket sie nicht bereitstellt.
ImageMagick bietet auch einen Windows-Installer, doch diese Anleitung behandelt weder PowerShell noch die Eingabeaufforderung. Eine Windows-Installation allein stellt die hier verwendete Bash-Umgebung nicht bereit.
Prüfen Sie die installierte Version und die verfügbaren Formate:
magick -version && magick -list format
Suchen Sie in der Versionszeile nach ImageMagick 7 und in der Modus-Spalte nach rw, sowohl für JPEG als auch für PNG.
Fehlt magick, korrigieren Sie die Installation oder den PATH, bevor Sie fortfahren.
Einen flachen Ordner skalieren und konvertieren
Legen Sie in Ihrem Arbeitsverzeichnis einen Eingabeordner an und legen Sie einige JPEGs hinein. Dieser Einrichtungsbefehl akzeptiert auch ein bereits vorhandenes Eingabeverzeichnis und ändert dessen Inhalt nicht:
mkdir -p input_images
Die kurzen Befehle verarbeiten nicht versteckte Dateien mit kleingeschriebener Endung .jpg direkt in input_images.
Für verschachtelte Ordner, andere JPEG-Endungen oder Namen mit Klammern oder Platzhalterzeichen
verwenden Sie stattdessen das rekursive Skript.
mogrify überschreibt normalerweise seine Eingabedateien.
Hier leitet -path die PNG-Kopien in ein neues Verzeichnis. && verhindert die Konvertierung, wenn dieses
Verzeichnis bereits existiert oder nicht angelegt werden kann:
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 wendet die EXIF-Ausrichtung des JPEG an, bevor die Größe geändert wird.
-regard-warnings lässt den Befehl bei Warnungen
scheitern, etwa bei einem abgeschnittenen JPEG. Ein Fehlschlag kann unvollständige Ausgaben
hinterlassen; prüfen Sie diese, bevor Sie den Stapel verwenden. Korrigieren Sie die Eingabe und
wählen Sie für einen weiteren Durchlauf ein neues Ausgabeverzeichnis.
Die Einstellung für literale Dateinamen verhindert, dass
Ausgabenamen wie photo%03d.png zu photo000.png werden. Das Quoten von Shell-Argumenten allein
deaktiviert die Dateinamen-Formatierung von ImageMagick nicht.
Die Geometrie der Größenänderung 800x600> behält das
Seitenverhältnis bei und verkleinert nur Bilder, die über die Box hinausgehen. Setzen Sie sie in
Anführungszeichen, damit Bash > nicht als Ausgabeumleitung interpretiert. Um allein die Breite zu
begrenzen, verwenden Sie stattdessen '800x>'.
| Eingabemaße | Ausgabemaße mit 800x600> |
|---|---|
| 1600 × 900 | 800 × 450 |
| 1200 × 1600 | 450 × 600 |
| 320 × 240 | 320 × 240 |
Prüfen Sie, was geschrieben wurde:
magick identify -format '%f: %m %wx%h\n' ./resized_png/*.png
Aus wide.jpg mit 1600 × 900 entsteht zum Beispiel wide.png: PNG 800x450. Die Begrenzungsbox ist eine
Obergrenze, die Ausgabe muss daher nicht exakt 800 × 600 groß sein.
Verschachtelte Ordner automatisieren
Ein rekursives find gefolgt von mogrify -path würde den Verzeichnisbaum verflachen: trip/photo.jpg
und work/photo.jpg könnten sich gegenseitig überschreiben. Dieses Skript bewahrt die Unterverzeichnisse und
hängt .png an den vollständigen Quelldateinamen an, sodass auch photo.jpg und photo.jpeg unterscheidbar bleiben.
Speichern Sie dies als neue Datei namens process_images.sh neben input_images. Legen Sie das Ausgabeverzeichnis
außerhalb des Eingabebaums an. Es darf noch nicht existieren.
#!/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"
Führen Sie es aus dem Verzeichnis aus, das das Skript und input_images enthält:
bash process_images.sh
Aus input_images/trip/photo.jpg wird zum Beispiel output_images/trip/photo.jpg.png.
Das Skript akzeptiert .jpg und .jpeg in beliebiger Groß- und Kleinschreibung. find -print0 und read -d '' bewahren
Leerzeichen und Zeilenumbrüche, während die Shell-Umleitung Namen wie -cover.jpg und
photo%03d.jpg bei Eingabe und Ausgabe wörtlich belässt. Die
Standard-Streams von ImageMagick transportieren die JPEG- und PNG-Bytes.
Das Skript prüft neben dem Exit-Status auch die Diagnosemeldungen der Konvertierung und weist ein
abgeschnittenes JPEG daher selbst dann zurück, wenn ImageMagick nur eine Warnung ausgibt. Es meldet
den Abschluss erst, wenn die gesamte Pipeline erfolgreich war. pipefail erkennt außerdem ein nicht
lesbares Verzeichnis, das find meldet. Ein fehlendes Eingabeverzeichnis, keine passenden JPEGs oder
eine fehlgeschlagene Konvertierung führen zu einem Status ungleich null. Die Ausgabe des
fehlgeschlagenen Bildes wird entfernt; zuvor erfolgreich erzeugte Ausgaben bleiben erhalten. Sehen
Sie sich einen fehlgeschlagenen Stapel an und wählen Sie ein neues OUTPUT_DIR, bevor Sie es erneut
versuchen. Verwenden Sie diesen Workflow für lokale Stapel gewöhnlicher Standbild-JPEGs.
Die Ausgabe für Ihre Website anpassen
Diese beiden optionalen Befehle verwenden denselben flachen Ordner input_images wie das erste Beispiel.
Jeder benötigt ein eigenes neues Ziel und lässt die Originale unangetastet. Ein fehlgeschlagener
Befehl kann einen unvollständigen Stapel hinterlassen, genau wie bei resized_png.
Thumbnails erstellen
Für quadratische Thumbnails füllen Sie das Quadrat mit '150x150^' und schneiden anschließend mithilfe von
-gravity center -extent 150x150 aus der Mitte zu. Dabei können kleine Bilder vergrößert und Motive am Rand weggeschnitten
werden:
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
Bilder fürs Web optimieren
Um Fotos als JPEGs zu behalten, kombinieren Sie die Begrenzungsbox mit einer JPEG-Qualitätseinstellung:
mkdir optimized &&
magick mogrify -regard-warnings -define registry:filename:literal=true \
-auto-orient -resize '800x600>' -quality 85 -path optimized ./input_images/*.jpg
-quality 85 ist eine Encoder-Einstellung auf der
JPEG-Qualitätsskala und kein Versprechen für 85 % visuelle Qualität oder eine bestimmte Reduzierung
der Dateigröße. Das erneute Codieren von JPEGs ist verlustbehaftet. Vergleichen Sie die
resultierenden Bytes und das Erscheinungsbild mit Ihren Originalen, bevor Sie sich für eine
Einstellung entscheiden; eine bereits stark komprimierte Quelle kann größer werden.
Wenn die Ausgabe falsch aussieht, prüfen Sie zuerst die Ausrichtungs-Metadaten und klären Sie dann, ob Sie eine Begrenzungsbox oder einen quadratischen Zuschnitt wollten. Wenn ein Befehl sich weigert, erneut zu laufen, prüfen Sie sein Ziel: Diese Beispiele verlangen bewusst ein neues Ausgabeverzeichnis, um das vorherige Ergebnis zu schützen.
