Lassen Sie mich zur Überprüfung die Analyse von ForeverWintr testen experimentell .
Die schlechteste Art von Eingabebild für die JPEG-Komprimierung (oder wirklich jede Komprimierung) ist gleichmäßig zufälliges RGB-Rauschen, das theoretisch inkomprimierbar ist. Lassen Sie mich mit den netpbm- Tools einige generieren :
$ rawtoppm < /dev/urandom 640 480 > rnd.ppm
$ pnmtopng < rnd.ppm > rnd.png
$ du -b rnd.*
923772 rnd.png
921615 rnd.ppm
(Gleichmäßig zufälliges RGB-Rauschen, verlustfreies PNG-Format, 903 kb)
Note (März 2017): Ich bin ziemlich sicher , dass das Bild oben war im PNG - Format , wenn ich zum ersten Mal dieser Antwort geschrieben und hochgeladen es wieder im Jahr 2013. Leider wäre es, (Es gibt sogar einen Kommentar über das Farbmanagement unter , dass diese stark impliziert.) Es scheint, als sei es irgendwann stillschweigend in JPEG konvertiert worden, was den visuellen Vergleich hier unbrauchbar macht.
Ich habe versucht, ein neues PNG-Testbild erneut hochzuladen, aber anscheinend trifft es bei imgur auf eine Art willkürliches PNG-Dateigrößenlimit und wird automatisch in JPEG konvertiert. Ich bin mir nicht sicher, ob es eine Möglichkeit gibt, dieses Problem zu umgehen, aber zumindest, wenn Sie Zugriff auf eine Linux-Box haben, können Sie die angegebenen Befehle jederzeit erneut ausführen, um Ihre eigenen Testimages zu generieren. Abgesehen davon, dass ein direkter visueller Vergleich der Komprimierungsqualität verhindert wird, wird dadurch die folgende Analyse in keiner Weise ungültig.
OK, die unkomprimierte PPM-Datei ist also erwartungsgemäß 640 × 480 × 3 = 921.600 Byte lang plus 15 Byte für den minimalen PPM-Header. Der Versuch, sie mit dem PNG-Format verlustfrei zu komprimieren, führt zu einer Vergrößerung um 2157 Byte, die vermutlich von PNG-Headern und -Metadaten belegt wird, und möglicherweise zu einer leichten Ineffizienz des Komprimierungsalgorithmus, der versucht, inkomprimierbare Daten zu komprimieren.
(Ja, das sind 3 Bytes pro Pixel, nicht 4; selbst das PPM-Format, das so einfach ist wie ein Grafikdateiformat, ist nicht dumm genug, um ein nutzloses viertes Byte pro Pixel auf der Festplatte zu speichern. Möglicherweise gibt es einige Dies ist aus Ausrichtungsgründen vorteilhaft, insbesondere wenn Sie auch einen Alpha-Kanal speichern müssen. Diese Gründe gelten jedoch nicht, wenn Sie das Bild in eine Datei schreiben.)
OK, was ist mit JPEG? Versuchen wir zunächst, die Kompressionsverluste zu minimieren (Qualität = 100, kein Chroma-Subsampling, Gleitkomma-DCT). Leider wird im pnmtojpeg
Handbuch nicht klar erklärt, wie alle relevanten Optionen festgelegt werden (die -sample
Option ist im Abschnitt "Optionen für Assistenten" aufgeführt, in dem nur auf eine Datei in der libjpeg-Dokumentation verwiesen wird). Daher konvertiere ich sie in die GIMP statt. Die resultierende Datei sieht folgendermaßen aus:
897249 rnd.jpg
(JPEG-komprimiertes RGB-Rauschen, Qualität = 100, kein Chroma-Subsampling, 876 kb)
Was, wie kann es kleiner sein? Habe ich nicht einfach gesagt, dass reines Rauschen inkompressibel ist? Nun, die Sache ist, dass selbst bei maximaler Qualität die normale JPEG-Komprimierung nicht ganz ist verlustfrei ist. Wenn Sie das Bild in GIMP erneut öffnen und mit dem Original vergleichen, können Sie feststellen, dass die Farbwerte einiger Pixel um ein oder zwei Schritte (von 256) verschoben wurden. Dies sind die Pixel, bei denen der JPEG-Komprimierungsalgorithmus "geschummelt" und hier ein wenig weggeworfen hat, und dort ein anderes, bei dem angenommen wurde, dass die Änderung nicht spürbar ist. Für das bloße menschliche Auge ist das Ergebnis zwar nicht vom Original zu unterscheiden, aber diese verworfenen Bits führen zu einer messbaren Verringerung der Dateigröße, selbst nach Berücksichtigung des Headers und des Codierungsaufwands.
Das war also höchste Qualität; Was ist mit typischeren Einstellungen wie den pnmtojpeg
Standardeinstellungen (Qualität = 75, Unterabtastung aktiviert)? Lass es uns versuchen:
$ pnmtojpeg < rnd.ppm > rnd2.jpg
$ du -b rnd2.jpg
185128 rnd2.jpg
(JPEG-komprimiertes RGB-Rauschen, Qualität = 75, Chroma-Unterabtastung, 184 kb)
Wow, von 901 auf 184 kb! Das ist allerdings eine ziemlich aggressive Komprimierung, und man kann den Unterschied definitiv feststellen, wenn man die Bilder genau vergleicht. Das meiste liegt an der Chroma-Unterabtastung, die im Grunde nur 75% der Farbdaten (Farbton / Sättigung) wegwirft. Wenn Sie es in GIMP mit deaktivierter Unterabtastung versuchen, erhalten Sie eine 350.618-Byte-Datei, die (zumindest für das menschliche Auge) dem Original ziemlich nahe kommt, auch wenn sie vergrößert ist.
Auf jeden Fall geht es darum zu demonstrieren, dass eine 640 × 480 JPEG-Datei , egal wie verrauscht Ihre Nachthimmelfotos sind und wie hoch die Qualität auch sein mag, auf keinen Fall signifikant größer als 900 sein kann kb. (Nun, es sei denn, Ihre Kamera hat ein Multi-Megabyte-Exif-Farbprofil oder etwas ähnlich Dummes angehängt.) Wenn Sie typischere JPEG-Komprimierungseinstellungen verwenden, wird die maximal plausible Dateigröße auf etwa 200 KB verringert .