Eines meiner Projekte beinhaltet mehrere Bilder im PNG Format. Da die Daten über das Internet geladen werden möchte ich, dass die Dateien möglichst klein sind ohne dass die Qualität leidet.
Da es um Logos geht die nur eine begrenzte Anzahl von Farben haben bietet es sich an die Bilder als PNG mit einer Palette abzuspeichern.
Einige Programme optimieren dann die Dateigröße noch weiter. Hier beschreibe ich die Schritte die ich unternehme um PNG zu verkleinern.
Details verwerfen
Der erste Schritt reduziert die Details. Genauer gesagt die Anzahl der verwendeten Farben. Das ist der einzige Schritt bei dem die Qualität leiden kann. Die späteren Maßnahmen sind alle verlustfrei.
Da meine Bitmaps Icons und Logos mit einer begrenzten Anzahl von Farben sind ist es kein Problem die Farbtiefe zu reduzieren. Je weniger verschiedene Farben es gibt desto besser lässt sich in den nächsten Schritten die Palette komprimieren.
Ich verwende pngquant um die Farben zu reduzieren. Da es mir mehr auf Qualität als auf Geschwindigkeit ankommt wähle ich den besten Level mit der geringsten Geschwindigkeit. Die Qualität gibt an wie dicht das Ergebnis am Original sein soll. Mit einer Qualität von 60-85 haben meine Bilder keine merklichen Unterschiede.
1 |
pngquant --speed=1 --quality=60-85 datei.png |
Besser komprimieren, verlustfrei
Die weiteren Schritte sind alle verlustfrei. Auch wenn man den ersten Schritt weglässt lassen sich mit den nächsten Schritten noch Verbesserungen erzielen. Das wird dadurch erreicht, dass die Palette geschickt komprimiert wird. Zum Beispiel kann die Reihenfolge der Farben in der Palette verändert werden um besser komprimieren zu können.
Zwei Werkzeuge dafür sind TruePNG und PNGZopfli. Da verschiedene Arten der Komprimierung verwendet werden lohnt es sich zu vergleichen welche am Besten ist. Damit kann man noch das letzte Byte an Optimierung rausquetschen.
Auf Englisch gibt es ein sehr ausführliches Tutorial das auch die technischen Hintergründe beschreibt.
Ich füttere meine Datei zuerst an TruePNG, später an PNGZopfli. Dabei verwende ich jedes mal die Einstellung für maximale Kompression. Manchmal kann Zopfli durch die bessere Komprimierung noch was rausholen, manchmal auch nicht.
1 2 |
truepng.exe /o max datei.png pngzopfli.exe datei.png 1000 |
Alternative Software
Statt TruePNG und Zopfli kann man sein Glück auch mit PNGOUT von Ken Silverman versuchen. Auch hier wird verlustfrei optimiert. Da es etwas aufwändig ist die ganzen Parameter von Hand durchzuprobieren um das beste Ergebnis zu finden gibt es mit PNGGaunlet eine nette GUI die das erledigt.
Ergebnisse in der Praxis
PNG verkleinern ist also garnicht so kompliziert. Um das Einsparpotential zu verdeutlichen: Die Originaldatei hatte 6181 Bytes. Wurde so von Paint.NET als PNG gespeichert. Nach der Behandlung mit den beschriebenen Tools hatte die Datei nur noch 1.625 Bytes. Die Datei wurde also auf etwa ein Viertel der ursprünglichen Größe verkleinert. Und das ohne sichtbaren Qualitätsverlust.
Update 2020
Ich habe eine eMail bekommen, in der ein „imagecompressor“ einer Seite Namens „websiteplanet“ empfohlen wird. Ich habe mir die Seite mal angesehen. Sie werben damit, dass sie Bilder optimieren und man keinen Unterschied sehen kann. Ein genauer Blick in den Quellcode zeigt dann auch warum. Das Originalbild und das angeblich „optimierte“ Beispielbild sind identisch, da von der gleichen URL geladen.
Die Optimierung, wenn man sie durchführt ist auch nicht verlustlos, sondern entspricht in etwa der Optimierung wie ich sie oben mit pngquant beschreibe. Die Webseite produziert ein PNG mit 22.488 Bytes. Ein einfaches Reduzieren des Originalbildes mit Irfanview von 24bit auf 8bit erreicht bereits eine Reduktion von 91.768 Bytes auf 24.324 Bytes. Wenn ich meinen oben beschriebenen Prozess anwende erreiche, ich eine reduzierte Größe von 19.878 Bytes. Also nochmal 10% besser als diese Webseite. Und ich muss meine Daten nicht auf fremde Webseites hochladen.