PNGs mit Oxipng per CLI und Rust optimieren
Um ein PNG mit Oxipng zu komprimieren und die Originaldatei zu behalten, verwenden Sie
--out mit einem anderen Dateinamen.
Die folgende Anleitung prüft das Ergebnis vorab, schreibt eine optimierte Kopie und führt dann
denselben Vorgang mit Rust aus. Sie verwendet gewöhnliche, nicht animierte PNGs und lässt die
optionalen verlustbehafteten Transformationen deaktiviert.
Verlustfreie PNG-Optimierung kann Kompression, Filterung, Palettenanordnung und Farbdarstellung ändern, ohne die decodierten Pixelwerte zu verändern. Ein anderer Datei-Hash bedeutet daher nicht, dass das Bild an Qualität verloren hat. Er beweist auch nicht, dass alle Metadaten erhalten geblieben sind. Behalten Sie die Quelldatei, wenn Sie ein Original zur Archivierung benötigen.
Oxipng installieren
Diese Bash-Beispiele wurden unter Linux mit Rust und Cargo 1.98.1 sowie Oxipng 10.2.1 getestet.
Sie benötigen Cargo in Ihrem PATH, einen C-Compiler und Linker für die
native Kompressionsabhängigkeit sowie das Binärverzeichnis von Cargo in Ihrem
PATH. Oxipng 10.2.1 gibt
Rust 1.88.0 als Mindestversion an.
cargo install oxipng --version 10.2.1 --locked &&
oxipng --version
Der Versionsbefehl sollte oxipng 10.2.1 ausgeben. Falls er eine andere Version
anzeigt, prüfen Sie vor dem Fortfahren, welche Binärdatei Ihre Shell findet.
cargo install baut standardmäßig im Release-Modus;
--locked verwendet die mitgelieferte Lockdatei für die Abhängigkeiten der Crate.
Ein einzelnes PNG optimieren
Legen Sie Ihr PNG als input.png im aktuellen Verzeichnis ab. Prüfen Sie zunächst
die Optimierung vorab, ohne etwas zu schreiben:
oxipng -o 4 --dry-run -v -- input.png
--dry-run führt die Optimierung trotzdem aus; nur das Schreiben des Ergebnisses
entfällt. Version 10 hat
das alte Flag --pretend ersetzt.
So speichern Sie das Ergebnis separat und vergleichen die Dateigrößen:
oxipng -o 4 -v --out optimized.png -- input.png &&
wc -c input.png optimized.png
Dabei bleibt input.png unverändert.
Eine vorhandene Datei optimized.png wird ohne Rückfrage ersetzt, auch bei einer
nicht interaktiven erneuten Ausführung. Wählen Sie einen neuen Zieldateinamen, wenn Sie eine frühere
Ausgabe behalten müssen. Das übergeordnete Verzeichnis des Ziels muss bereits existieren.
Voreinstellung vier ist ein Ausgangspunkt, keine garantierte Einsparung. Verfügbar sind die Stufen null bis sechs; der Standard ist zwei. Höhere Voreinstellungen investieren mehr Rechenaufwand in die Suche, garantieren aber kein kleineres Ergebnis. Ein bereits optimiertes PNG wird möglicherweise nicht kleiner. Mit diesen Einstellungen wird trotzdem eine separate Ausgabe geschrieben. Kann Oxipng die ursprünglichen Bytes nicht verbessern, werden diese verwendet. Ohne separates Ziel bleibt die Eingabedatei in diesem Fall unverändert.
Oxipng nutzt standardmäßig die verfügbaren logischen CPUs. Fügen Sie --threads 4
hinzu, um die Worker-Threads auf einem gemeinsam genutzten Rechner zu begrenzen. Die vollständige
Optionsliste finden Sie im versionierten CLI-Handbuch.
Festlegen, was erhalten bleibt
Hier sind drei unterschiedliche Arten des Erhalts relevant:
| Einstellung | Bedeutung |
|---|---|
Ohne --alpha | RGB-Werte bleiben auch in vollständig transparenten Pixeln erhalten. Mit --alpha dürfen diese verborgenen Farben zur Kompression geändert werden; das ist visuell verlustfrei, verändert aber Pixeldaten. |
Ohne --strip | PNG-Metadaten, die nach der Optimierung gültig bleiben, werden mit den unten genannten Ausnahmen beibehalten. |
--preserve | Versucht, Dateisystemberechtigungen und Änderungszeit beizubehalten. Dies steuert weder PNG-Metadaten noch erhält es die Zugriffszeit. |
Auch die Bibliotheksoptionen lassen die Alpha-Optimierung und die
verlustbehaftete Skalierung von 16 auf acht Bit standardmäßig deaktiviert. Fügen Sie
--scale16 nicht hinzu, wenn Sie verlustfreie Pixelwerte benötigen.
Der standardmäßige Erhalt von Metadaten ist keine exakte Archivierung. Oxipng entfernt
bKGD, sBIT und hIST,
wenn eine Änderung des Farbtyps oder der Bittiefe sie ungültig macht. Außerdem entfernt es
standardmäßig die Chunks caBX von C2PA und iDOT
von Apple. Ein eingebettetes ICC-Profil kann erneut komprimiert werden. Dieses Verhalten ist in der
Implementierung der Chunk-Verarbeitung und im CLI-Handbuch
beschrieben.
Verwenden Sie --strip safe nur, wenn Sie Zusatzinformationen wie Text und EXIF
verwerfen möchten. Es behält ausgewählte darstellungsrelevante Chunks bei, darunter
sRGB und pHYs, garantiert aber nicht den Erhalt
aller Metadaten. --strip all geht weiter und kann Farbmanagementinformationen
entfernen, wodurch sich die Darstellung eines Bildes ändert. Keine der beiden Optionen wird für
die Beispiele hier benötigt.
Wenn Sie Ihre Eingabedatei bewusst ersetzen und dabei ihre Dateiberechtigungen und Änderungszeit beibehalten möchten, verwenden Sie:
oxipng -o 4 --preserve -- input.png
Dieser Vorgang ändert die Datei direkt: Erstellen Sie vor der Ausführung eine Sicherungskopie. Der Erhalt der Attribute wird nach Möglichkeit versucht; Oxipng warnt, wenn es ein Attribut nicht wiederherstellen kann.
Einen Ordner im Stapel verarbeiten
Für ein Verzeichnis mit PNG-Dateien, die Sie ersetzen können, führen Sie Folgendes aus:
find ./images -type f -name '*.png' -exec oxipng -o 4 --preserve -- {} +
Dies durchsucht auch verschachtelte Verzeichnisse und übergibt Dateinamen mit Leerzeichen sicher.
Es erfasst Dateien mit der kleingeschriebenen Erweiterung .png und ändert
sie direkt; eine erneute Ausführung bearbeitet dieselben Dateien. Fügen Sie den Oxipng-Argumenten
--dry-run hinzu, um eine Vorschau zu erhalten. Verwenden Sie eine Kopie des
Dateiverzeichnisses, wenn Sie die Originale behalten müssen.
Oxipng in Ihren Rust-Code einbetten
Erstellen Sie ein neues Projekt und legen Sie dieselbe Crate-Version fest:
cargo new --bin --vcs none png-optimize &&
cd png-optimize &&
cargo add oxipng@=10.2.1
Fahren Sie erst fort, wenn dies erfolgreich war. Ein vorhandenes Verzeichnis
png-optimize lässt cargo new fehlschlagen;
wählen Sie einen neuen Projektnamen, statt ein bestehendes Projekt zu löschen. Behalten Sie die
generierte Datei Cargo.lock, um die aufgelösten Abhängigkeitsversionen zu erhalten.
Legen Sie eine Kopie Ihres PNGs als input.png in diesem Projektverzeichnis ab.
Ersetzen Sie die generierte Datei src/main.rs durch dieses vollständige Programm:
use oxipng::{optimize, InFile, Options, OutFile};
use std::path::PathBuf;
fn main() -> Result<(), oxipng::PngError> {
let input = InFile::Path(PathBuf::from("input.png"));
let output = OutFile::from_path(PathBuf::from("output.png"));
let options = Options::from_preset(4);
let (before, after) = optimize(&input, &output, &options)?;
println!("{before} -> {after} bytes: output.png");
Ok(())
}
Führen Sie in png-optimize Folgendes aus:
cargo run --release
Das Programm liest input.png relativ zum aktuellen Verzeichnis, schreibt
output.png und gibt die Byteanzahlen für Eingabe und Ausgabe aus, die
optimize zurückgibt.
Eine vorhandene Datei output.png wird ohne Rückfrage ersetzt. Gleiche Byteanzahlen
sind ein gültiges Ergebnis, kein Fehler.
OutFile::from_path wählt eine separate Datei und fordert
keinen Attributerhalt an. Verwenden Sie OutFile::None für einen Probelauf mit der
Bibliothek oder OutFile::Path { path: Some(PathBuf::from("output.png")), preserve_attrs: true }, wenn die Ausgabe die Berechtigungen und Änderungszeit
der Eingabedatei übernehmen soll.
Fehlerhafte Eingaben in einem Build behandeln
Eine fehlende oder fehlerhafte Eingabe führt dazu, dass die CLI mit einem Fehlerstatus endet.
Das Rust-Beispiel reicht PngError über ? weiter.
Es endet daher ebenfalls mit einem Fehlerstatus und gibt die Byteanzahlen für einen erfolgreichen
Durchlauf nicht aus. Führen Sie es einmal ohne input.png aus, um diesen
Fehlerpfad zu sehen. Auch ein fehlendes Ausgabeverzeichnis oder ein Fehler bei den
Schreibberechtigungen kann den Vorgang scheitern lassen.
Prüfen Sie den Exit-Status, bevor Sie eine Ausgabedatei weiterverwenden: Nach einem fehlgeschlagenen Durchlauf kann weiterhin eine ältere Ausgabe existieren. Eine erfolgreiche Optimierung ist zudem nicht gleichbedeutend mit einer Größenreduktion. Behandeln Sie Fehlschläge beim Build Ihrer Assets als Fehler und erfassen Sie die tatsächlichen Byteanzahlen, statt eine feste Einsparung zu verlangen.
