Verlustfreie Datenoptimierung
Verfasst: 12.11.2011, 15:18
(Vorwort: Unter Verlustfreiheit verstehe ich hier, die Dateien und Dateiformate zu verändern, ohne die Qualität des Inhalts zu verschlechtern. Alle Resultate sollten immer gegengetestet werden. Obwohl die verlinkten Tools üblicherweise zuverlässig und fehlerfrei arbeiten, könnten im Voraus beschädigte Dateien zerstört werden.)
Ein paar Tipps, wie man ohne Qualitätseinbußen Platz sparen kann:
Die kleinsten Daten sind die, die man nicht speichert
Das musste jetzt einfach sein. In Kram, den man nicht braucht, Speicherplatz und Rechenzeit zu investieren, ist Verschwendung. Man sollte löschen, was überflüssig ist, und erst dann optimieren. Überflüssige Daten sind nicht immer offensichtlich: JPEG- und PNG-Dateien können Kommentare und Metadaten bis hin zu Thumbnails enthalten; MP3s Informationen über Online-Shops und Album-Covers.
JPG-Bilder optimieren
JPEG ist zwar grundsätzlich ein verlustbehaftetes Format; die Kompression vieler Dateien lässt sich aber noch nachträglich optimieren, ohne Bilddaten zu zerstören:
Die meisten Programme greifen beim Anlegen von JPEG auf fixe Huffman-Tabellen zurück, anstatt sie für individuelle Bilder auszulegen, und vertun damit 5–10 % Kompressionsrate. Das gilt insbesondere für Erzeuger, die auf wenig Rechenleistung zurückgreifen können, wie bspw. Handykameras. Professionelle Bildbearbeitungsprogramme (bspw. Gimp) bieten die Optimierung meist direkt beim Export an; aber nicht alle Künstler machen davon gebrauch. Nachträglich optimiert jpegtran die Huffman-Kodierung von JPEG-Dateien und konvertiert sie zu progressiven Bildern. Das erhöht die Zeit, die zum Dekodieren nötig ist – weil das Bild in mehreren Durchläufen von einer niedrig zu einer hoch aufgelösten Version verfeinert wird – bewirkt aber, dass die Koeffizienten der Diskreten Kosinustransformation in der Datei sortiert vorliegen und erlaubt dadurch eine erneut um 5–10 % kleinere Datei.
Mozilla hat (mit Unterstützung von Facebook) in den letzten Monaten an mozjpeg gearbeitet – einem libjpg-Ersatz, der JPEG-Verarbeitung optimieren soll ohne dabei Kompatibilität zu opfern. Sie haben in der ersten Iteration die Funktionalität eingebaut, die ursprünglich JPEGrescan als Perl-Skript anbot. Mit Version 2 wurde Trellis-Quantisierung eingeführt. Produkt ist mozjpegtran, das sich kompiliert z.B. bei encode.ru herunterladen lässt. Unter’m Strich werden JPEGs damit verlustfrei um weitere 0,2–1,5 % kleiner als zuvor mit jpegtran aus libjpg.Ultimativ lässt sich die Huffman-Kodierung durch eine arithmetische Kodierung ersetzen (auch diese Option bietet jpegtran). Das bringt wieder 10–20 %; die Dateien sind dann aber nicht mehr durch den Baseline-Standard abgedeckt (lassen sich also nur noch mit wenigen professionellen Programmen öffnen, weil die Algorithmen bis vor kurzem Patenten unterlagen).
Zu guter Letzt können noch ein paar KiB gespart werden, indem das Vorschaubild aus den EXIF-Daten entfernt wird. EXIF-Thumbnails sind nicht wirklich nötig (Windows’ Explorer unterhält beispielsweise einen Thumbnail-Cache, dessen Inhalt direkt aus dem Bildinhalt berechnet wird, falls die Datei kein Vorschaubild liefert) und können manchmal störend sein (etwa, wenn das Bild mit jpegtran rotiert wurde, das Vorschaubild aber weiter die nicht rotierte Version anzeigt). Normalerweise machen sie einen kaum merklichen Größenunterschied aus; bei kleinen Dateien (z.B. Handyfotos) können es aber viele Prozent sein.
Das EXIF-Manipulationsprogramm schlechthin scheint ExifTool zu sein. Ich finde es ziemlich kompliziert zu bedienen; aber auch hier schafft wieder eine Stapelverarbeitungsdatei Abhilfe:
BMP-, GIF- und PNG-Grafiken optimieren
BMP-Dateien enthalten entweder unkomprimierte oder sehr schwach (RLE-)komprimierte Daten und sollten, falls sie nicht in exotischen Pixelformaten vorliegen, zu PNG-Dateien konvertiert werden. Gleiches gilt für nicht-animierte GIFs, deren LZW-Kompression der von PNG fast immer unterlegen ist. PNG ist grundsätzlich verlustfrei, und die Konvertierung lässt sich bspw. mit OptiPNG durchführen – mehr dazu im nächsten Abschnitt.
PNG an sich erreicht seine Kompression zweistufig: Zuerst wird das zweidimensionale Problem zu einem eindimensionalen reduziert, indem auf jede Zeile ein Filter angewandt wird. Danach werden die Daten mit Deflate komprimiert; wofür zwar die Dekompression spezifiziert ist, nicht aber die Kompression – dadurch ergibt sich eine hohe Bandbreite von möglichen Optimierungen, die von keinem Programm komplett abgedeckt wird. Meine persönliche Wahl ist OptiPNG zur Optimierung der Filter, gefolgt von PNGOUT mit verschiedenen Filterstufen. Je nachdem, wie viel Zeit man ins Sparen weiterer Bits investieren möchte, kann man auch hochgehen bis PNG Monster.
Die Ersparnisse sind ebenso breitbandig wie das Angebot an PNG-erzeugenden und -optimierenden Dateien: Via Paint erzeugte PNG-Grafiken lassen sich mit genügend investierter Zeit oft auf 50 % der Ursprungsgröße optimieren; komplexe Bilder, die von vornherein hoch komprimiert gespeichert wurden, oft nur um eine einstellige Prozentzahl. Das Laden wird grundsätzlich ein Bisschen schneller, weil die Ausführungszeit des Dekompressionsalgorithmus in erster Linie von der Größe der komprimierten Daten abhängig ist. Gegenüber BMP haben optimierte PNGs gewöhnlich nur 60 % (Fotos) bis 10 % (synthetische Grafiken) der Ausgangsgröße.
Zu guter Letzt noch ein Wort zu GIFs, die man als solche behalten möchte oder muss (beispielsweise, weil sie animiert sind): Ich habe lange nach GIF-Optimierungsprogrammen gesucht; aber diese Suche ist oft eine Reise in die Tripod-Zeit des vorherigen Jahrtausends. Das einzig akzeptable, kostenfreie Programm, das ich gefunden habe, ist Trout's GIF Optimizer. Die Ergebnisse sind recht mager: Etwa die Hälfte der GIFs (hauptsächlich Animierte) lässt sich damit um 1–3 % verkleinern; in Einzelfällen auch um bis zu 70 %. (Da die Resultate in anderen Fällen bis zu 20 % hinter dem Original liegen, denke ich, dass es dort enormes Optimierungspotential gibt.)
VHD-Dateien optimieren
Virtuelle Festplatten simulieren eine unerwünschte Nebenwirkung von realen Festplatten: Löscht man Dateien, so werden nur die Einträge in der Dateitabelle gelöscht, aber die Daten werden nicht tatsächlich vom Datenträger gelöscht. Virtuelle Festplatten wachsen deshalb über die tatsächlichen Ansprüche des virtuellen Systems hinaus, weil gelöschte Daten weiter in der VHD-Datei gespeichert bleiben. Erst wenn der ungenutzte Festplattenspeicher genullt wurde, kann das Wirtsystem diesen Platz aus der virtuellen Festplatte zurückgewinnen.
Nutzer von Microsofts Virtual PC können dieser einfachen Anleitung folgen.
Für die, die es mit VHD-Dateien unter Windows von Hand erledigen wollen, erweist sich Mark Russinovichs SDelete als sehr nützlich:
ZIP-, RAR- und 7Z-Archive optimieren
Der größte Fehler, den man bei der Archivierung machen kann, ist, Daten zu komprimieren, die bereits mit einem schwächeren Kompressionsalgorithmus komprimiert wurden. Zur Archivierung sollten die Daten möglichst „breit aufgefächert“ vorliegen, das bedeutet: alle ZIP-, RAR- und 7Z-Dateien, die im Archiv landen sollen, sollten unbedingt zuvor entpackt werden. Falls man Installer archivieren möchte, die als selbstextrahierendes Archiv ausgeliefert wurden, lohnt es, sie vorher zu entpacken. Dasselbe gilt für ISO-CD-/-DVD-Abbilder, sofern es im Kontext sinnvoll ist. (7-Zip bietet die Möglichkeit, via Rechtsklick -> 7-Zip -> Open archive auch aus „normalen“ Installern, Flash Video-Dateien, ISO-Dateien u.v.m. Ressourcen zu extrahieren – dadurch kann man selektieren, was von dem Paket man archivieren möchte und was nicht.)
Dasselbe gilt übrigens für Bilder und Videos: Anstatt das Archivierungsprogramm mit bereits vorkomprimierten Daten zu füttern (bspw. indem man Bilder als optimierte PNGs übergibt), sollte man sich die wesentlich langsamere und stärkere Kompression des Archivierungsprogramms zu nutze machen.
Für PNGs bedeutet das, dass sie unkomprimiert oder als BMP gespeichert werden sollten; ich habe mit ArchiPNG auch ein Tool geschrieben, das die Kompression zwar aufgibt, die Zeilenfilter aber zugleich für bessere Kompression durch 7-Zip optimiert.
JPGs sind ein schwieriger Fall: Man kann sie nicht ohne weiteres unkomprimiert speichern, weil die Rekodierung möglicherweise stark verlustbehaftet wäre. Andererseits ist ihre Huffmankodierung relativ schwach und nur sehr wenige Archivierungsprogramme benutzen auf JPG optimierte Modelle (bspw. PAQ, das die Huffman-Kodierung durch leistungsfähigere arithmetische Kodierung ersetzt und beim Entpacken wiederherstellt). Vorerst empfehle ich, JPGs zu optimieren, dann zu archivieren und zu hoffen, dass sich der Kompressionsalgorithmus nicht daran verschluckt.
Die Vergleiche von WinZIP, WinRAR und 7-Zip sind meist weniger Vergleiche der Programmleistung als vielmehr Vergleiche der zugrundeliegenden Algorithmen – Deflate bei WinZIP, RAR bei WinRAR und LZMA bei 7-Zip. Hier liegt auch der Hund begraben: Jede Art von Daten lässt sich mit einem anderen Algorithmus optimal komprimieren; Text z.B. ganz anders als Fotos. (Ich persönlich benutze zur Archivierung ausschließlich 7-Zip und beziehe meine Tipps deshalb auch nur darauf.) Dieses Verhalten ist zur Zeit noch sehr wenigen Archivierungsprogrammen inhärent (WinZIPs und WinRARs Unterstützung für eine breite Palette von Kompressionsalgorithmen ist noch relativ jung) und erfordert eine ausgeklügelte Heuristik – oder Brute Force.
Den Brute Force-Ansatz macht sich Ultra7z zunutze: Es fasst alle Dateien eines Archivs gemäß ihren Dateierweiterungen zusammen, probiert für jeden Block verschiedene Filter und Kompressionsalgorithmen aus, und wählt zu guter letzt den optimalen Kandidaten. Dadurch werden 7Z-Archive gut 5–30 % kleiner. Der erste Schritt – die Sortierung nach Dateinamen – offenbart das große Optimierungspotential: Indem man die Dateierweiterungen ändert, kann man dafür sorgen, dass Dateien ähnlichen Inhalts zusammen optimal komprimiert werden. Für Spieleentwickler bedeutet das etwa: 16-Bit-Texturen sollte eine andere Dateierweiterung gegeben werden als 32-Bit-Texturen; Diffuse Maps eine andere als Normal Maps. Mit auf diese Weise optimierten 7Z-Archiven erreicht man bestenfalls die halbe Größe eines naiv gepackten ZIP-Archivs (allerdings ist die Laufzeit recht hoch – etwa eine Stunde pro 100 MiB im Ultra-Modus).
Ich lade jeden ein, die Liste fortzuführen. Insbesondere würden mich Tricks zur verlustfreien Videooptimierung interessieren, weil die den Großteil meiner Festplatte besetzen. Auch bzgl. WAV und MP3 habe ich bisher nichts brauchbares gefunden.
Ein paar Tipps, wie man ohne Qualitätseinbußen Platz sparen kann:
Die kleinsten Daten sind die, die man nicht speichert
Das musste jetzt einfach sein. In Kram, den man nicht braucht, Speicherplatz und Rechenzeit zu investieren, ist Verschwendung. Man sollte löschen, was überflüssig ist, und erst dann optimieren. Überflüssige Daten sind nicht immer offensichtlich: JPEG- und PNG-Dateien können Kommentare und Metadaten bis hin zu Thumbnails enthalten; MP3s Informationen über Online-Shops und Album-Covers.
JPG-Bilder optimieren
JPEG ist zwar grundsätzlich ein verlustbehaftetes Format; die Kompression vieler Dateien lässt sich aber noch nachträglich optimieren, ohne Bilddaten zu zerstören:
Die meisten Programme greifen beim Anlegen von JPEG auf fixe Huffman-Tabellen zurück, anstatt sie für individuelle Bilder auszulegen, und vertun damit 5–10 % Kompressionsrate. Das gilt insbesondere für Erzeuger, die auf wenig Rechenleistung zurückgreifen können, wie bspw. Handykameras. Professionelle Bildbearbeitungsprogramme (bspw. Gimp) bieten die Optimierung meist direkt beim Export an; aber nicht alle Künstler machen davon gebrauch. Nachträglich optimiert jpegtran die Huffman-Kodierung von JPEG-Dateien und konvertiert sie zu progressiven Bildern. Das erhöht die Zeit, die zum Dekodieren nötig ist – weil das Bild in mehreren Durchläufen von einer niedrig zu einer hoch aufgelösten Version verfeinert wird – bewirkt aber, dass die Koeffizienten der Diskreten Kosinustransformation in der Datei sortiert vorliegen und erlaubt dadurch eine erneut um 5–10 % kleinere Datei.
Mozilla hat (mit Unterstützung von Facebook) in den letzten Monaten an mozjpeg gearbeitet – einem libjpg-Ersatz, der JPEG-Verarbeitung optimieren soll ohne dabei Kompatibilität zu opfern. Sie haben in der ersten Iteration die Funktionalität eingebaut, die ursprünglich JPEGrescan als Perl-Skript anbot. Mit Version 2 wurde Trellis-Quantisierung eingeführt. Produkt ist mozjpegtran, das sich kompiliert z.B. bei encode.ru herunterladen lässt. Unter’m Strich werden JPEGs damit verlustfrei um weitere 0,2–1,5 % kleiner als zuvor mit jpegtran aus libjpg.
Zu guter Letzt können noch ein paar KiB gespart werden, indem das Vorschaubild aus den EXIF-Daten entfernt wird. EXIF-Thumbnails sind nicht wirklich nötig (Windows’ Explorer unterhält beispielsweise einen Thumbnail-Cache, dessen Inhalt direkt aus dem Bildinhalt berechnet wird, falls die Datei kein Vorschaubild liefert) und können manchmal störend sein (etwa, wenn das Bild mit jpegtran rotiert wurde, das Vorschaubild aber weiter die nicht rotierte Version anzeigt). Normalerweise machen sie einen kaum merklichen Größenunterschied aus; bei kleinen Dateien (z.B. Handyfotos) können es aber viele Prozent sein.
Das EXIF-Manipulationsprogramm schlechthin scheint ExifTool zu sein. Ich finde es ziemlich kompliziert zu bedienen; aber auch hier schafft wieder eine Stapelverarbeitungsdatei Abhilfe:
BMP-Dateien enthalten entweder unkomprimierte oder sehr schwach (RLE-)komprimierte Daten und sollten, falls sie nicht in exotischen Pixelformaten vorliegen, zu PNG-Dateien konvertiert werden. Gleiches gilt für nicht-animierte GIFs, deren LZW-Kompression der von PNG fast immer unterlegen ist. PNG ist grundsätzlich verlustfrei, und die Konvertierung lässt sich bspw. mit OptiPNG durchführen – mehr dazu im nächsten Abschnitt.
PNG an sich erreicht seine Kompression zweistufig: Zuerst wird das zweidimensionale Problem zu einem eindimensionalen reduziert, indem auf jede Zeile ein Filter angewandt wird. Danach werden die Daten mit Deflate komprimiert; wofür zwar die Dekompression spezifiziert ist, nicht aber die Kompression – dadurch ergibt sich eine hohe Bandbreite von möglichen Optimierungen, die von keinem Programm komplett abgedeckt wird. Meine persönliche Wahl ist OptiPNG zur Optimierung der Filter, gefolgt von PNGOUT mit verschiedenen Filterstufen. Je nachdem, wie viel Zeit man ins Sparen weiterer Bits investieren möchte, kann man auch hochgehen bis PNG Monster.
Die Ersparnisse sind ebenso breitbandig wie das Angebot an PNG-erzeugenden und -optimierenden Dateien: Via Paint erzeugte PNG-Grafiken lassen sich mit genügend investierter Zeit oft auf 50 % der Ursprungsgröße optimieren; komplexe Bilder, die von vornherein hoch komprimiert gespeichert wurden, oft nur um eine einstellige Prozentzahl. Das Laden wird grundsätzlich ein Bisschen schneller, weil die Ausführungszeit des Dekompressionsalgorithmus in erster Linie von der Größe der komprimierten Daten abhängig ist. Gegenüber BMP haben optimierte PNGs gewöhnlich nur 60 % (Fotos) bis 10 % (synthetische Grafiken) der Ausgangsgröße.
Zu guter Letzt noch ein Wort zu GIFs, die man als solche behalten möchte oder muss (beispielsweise, weil sie animiert sind): Ich habe lange nach GIF-Optimierungsprogrammen gesucht; aber diese Suche ist oft eine Reise in die Tripod-Zeit des vorherigen Jahrtausends. Das einzig akzeptable, kostenfreie Programm, das ich gefunden habe, ist Trout's GIF Optimizer. Die Ergebnisse sind recht mager: Etwa die Hälfte der GIFs (hauptsächlich Animierte) lässt sich damit um 1–3 % verkleinern; in Einzelfällen auch um bis zu 70 %. (Da die Resultate in anderen Fällen bis zu 20 % hinter dem Original liegen, denke ich, dass es dort enormes Optimierungspotential gibt.)
VHD-Dateien optimieren
Virtuelle Festplatten simulieren eine unerwünschte Nebenwirkung von realen Festplatten: Löscht man Dateien, so werden nur die Einträge in der Dateitabelle gelöscht, aber die Daten werden nicht tatsächlich vom Datenträger gelöscht. Virtuelle Festplatten wachsen deshalb über die tatsächlichen Ansprüche des virtuellen Systems hinaus, weil gelöschte Daten weiter in der VHD-Datei gespeichert bleiben. Erst wenn der ungenutzte Festplattenspeicher genullt wurde, kann das Wirtsystem diesen Platz aus der virtuellen Festplatte zurückgewinnen.
Nutzer von Microsofts Virtual PC können dieser einfachen Anleitung folgen.
Für die, die es mit VHD-Dateien unter Windows von Hand erledigen wollen, erweist sich Mark Russinovichs SDelete als sehr nützlich:
- Systemsteuerung -> Verwaltung -> Computerverwaltung; links in die Datenträgerverwaltung
- oben im Menü Aktion -> Attach VHD -> VHD-Datei laden
- Für alle Partitionen wiederholen: sdelete -z x: (wobei x: der Laufwerksbuchstabe der Partition ist)
- In der Datenträgerverwaltung links auf die VHD-Festplatte klicken -> Detach VHD -> OK
- z.B. in Virtual PC über den Assistent für virtuelle Datenträger die VHD-Datei kompaktieren
ZIP-, RAR- und 7Z-Archive optimieren
Der größte Fehler, den man bei der Archivierung machen kann, ist, Daten zu komprimieren, die bereits mit einem schwächeren Kompressionsalgorithmus komprimiert wurden. Zur Archivierung sollten die Daten möglichst „breit aufgefächert“ vorliegen, das bedeutet: alle ZIP-, RAR- und 7Z-Dateien, die im Archiv landen sollen, sollten unbedingt zuvor entpackt werden. Falls man Installer archivieren möchte, die als selbstextrahierendes Archiv ausgeliefert wurden, lohnt es, sie vorher zu entpacken. Dasselbe gilt für ISO-CD-/-DVD-Abbilder, sofern es im Kontext sinnvoll ist. (7-Zip bietet die Möglichkeit, via Rechtsklick -> 7-Zip -> Open archive auch aus „normalen“ Installern, Flash Video-Dateien, ISO-Dateien u.v.m. Ressourcen zu extrahieren – dadurch kann man selektieren, was von dem Paket man archivieren möchte und was nicht.)
Dasselbe gilt übrigens für Bilder und Videos: Anstatt das Archivierungsprogramm mit bereits vorkomprimierten Daten zu füttern (bspw. indem man Bilder als optimierte PNGs übergibt), sollte man sich die wesentlich langsamere und stärkere Kompression des Archivierungsprogramms zu nutze machen.
Für PNGs bedeutet das, dass sie unkomprimiert oder als BMP gespeichert werden sollten; ich habe mit ArchiPNG auch ein Tool geschrieben, das die Kompression zwar aufgibt, die Zeilenfilter aber zugleich für bessere Kompression durch 7-Zip optimiert.
JPGs sind ein schwieriger Fall: Man kann sie nicht ohne weiteres unkomprimiert speichern, weil die Rekodierung möglicherweise stark verlustbehaftet wäre. Andererseits ist ihre Huffmankodierung relativ schwach und nur sehr wenige Archivierungsprogramme benutzen auf JPG optimierte Modelle (bspw. PAQ, das die Huffman-Kodierung durch leistungsfähigere arithmetische Kodierung ersetzt und beim Entpacken wiederherstellt). Vorerst empfehle ich, JPGs zu optimieren, dann zu archivieren und zu hoffen, dass sich der Kompressionsalgorithmus nicht daran verschluckt.
Die Vergleiche von WinZIP, WinRAR und 7-Zip sind meist weniger Vergleiche der Programmleistung als vielmehr Vergleiche der zugrundeliegenden Algorithmen – Deflate bei WinZIP, RAR bei WinRAR und LZMA bei 7-Zip. Hier liegt auch der Hund begraben: Jede Art von Daten lässt sich mit einem anderen Algorithmus optimal komprimieren; Text z.B. ganz anders als Fotos. (Ich persönlich benutze zur Archivierung ausschließlich 7-Zip und beziehe meine Tipps deshalb auch nur darauf.) Dieses Verhalten ist zur Zeit noch sehr wenigen Archivierungsprogrammen inhärent (WinZIPs und WinRARs Unterstützung für eine breite Palette von Kompressionsalgorithmen ist noch relativ jung) und erfordert eine ausgeklügelte Heuristik – oder Brute Force.
Den Brute Force-Ansatz macht sich Ultra7z zunutze: Es fasst alle Dateien eines Archivs gemäß ihren Dateierweiterungen zusammen, probiert für jeden Block verschiedene Filter und Kompressionsalgorithmen aus, und wählt zu guter letzt den optimalen Kandidaten. Dadurch werden 7Z-Archive gut 5–30 % kleiner. Der erste Schritt – die Sortierung nach Dateinamen – offenbart das große Optimierungspotential: Indem man die Dateierweiterungen ändert, kann man dafür sorgen, dass Dateien ähnlichen Inhalts zusammen optimal komprimiert werden. Für Spieleentwickler bedeutet das etwa: 16-Bit-Texturen sollte eine andere Dateierweiterung gegeben werden als 32-Bit-Texturen; Diffuse Maps eine andere als Normal Maps. Mit auf diese Weise optimierten 7Z-Archiven erreicht man bestenfalls die halbe Größe eines naiv gepackten ZIP-Archivs (allerdings ist die Laufzeit recht hoch – etwa eine Stunde pro 100 MiB im Ultra-Modus).
Ich lade jeden ein, die Liste fortzuführen. Insbesondere würden mich Tricks zur verlustfreien Videooptimierung interessieren, weil die den Großteil meiner Festplatte besetzen. Auch bzgl. WAV und MP3 habe ich bisher nichts brauchbares gefunden.