Was ist die größte Größe eines 640 x 480 JPEG?

25

Ich erstelle ein Datenspeichergerät, das eine bestimmte Anzahl von Bildern des Nachthimmels über ein paar Stunden hinweg aufnimmt. Die Bilder werden direkt nach der Aufnahme heruntergeladen. Auf der Speicherkarte müssen alle Bilder gleichzeitig gespeichert werden können.

Die JPEGs, die aufgenommen werden, sind 640 x 480 Pixel, und es ist wichtig, dass auf der Speicherkarte genügend Platz für alle 100 vorhanden ist. Was ist die größte Größe eines 640 x 480 JPEG?

Ich habe einige Testbilder gemacht, um das herauszufinden:

# 1# 2#3

  • Die Dateigröße des "Stackoverflow" -Bildes beträgt 73.774 Bytes.
  • Die Dateigröße des weißen Bildes beträgt nur 36.607 Bytes.
  • Die Dateigröße für die karierten Fotouhren liegt aber bei 149.339 Bytes.

Ich gehe davon aus, dass die Dateigröße mit der Komplexität zunimmt.

Wie kann ich genug Platz auf der Speicherkarte schaffen, um 100 JPEGs (640 x 480) aufzunehmen, ohne zu wissen, wie kompliziert und wie groß diese sein werden? Ich möchte keinen zusätzlichen Platz verschwenden, da ich möglicherweise viele dieser Aufnahmegeräte herstelle.

Blaues Eis
quelle
es kommt auf den bildproduzenten an. JPEG in 100er Qualität kann leicht in die Luft jagen. Was ist Ihre Kamera und Kameraeinstellungen?
John Dvorak
Die Testkamera ist eine Canon Powershot A1100 IS. Für weitere Informationen können Sie die Metadaten überprüfen, da ich nicht sicher bin, wonach Sie fragen.
Blue Ice
1
Habe Sie ein Beispielfoto des Nachthimmels bei Dif gemacht? Q Einstellungen? Als Test?
Carl B
2
Was ist das für ? Sind Sie sicher, JPEG ist die richtige Wahl des Formats.
Jack Aidley
3
Das Hinzufügen von Hintergrundinformationen zu Jack Aidleys Kommentar: Die JPEG-Komprimierung ändert das Bild. Es werden Annahmen getroffen und Informationen verworfen, um eine kleinere Dateigröße zu erhalten. (Sofern nicht auf 100% Qualität eingestellt, können Sie in diesem Fall auch ein unkomprimiertes Format verwenden. Häufig hat eine Digitalkamera eine Tiff - oder sogar eine Raw - Einstellung. Wenn Sie alle kleinen Punkte wie Sterne beibehalten möchten, verwenden Sie eine der folgenden Optionen: diese). Dies macht auch die Größe eines Bildes vollständig vorhersehbar.
Hennes

Antworten:

22

Hier schlage ich eine Obergrenze für JPEG-Dateigrößen vor. Sehen der Antwort von Ilmari Karonen finden Sie eine Diskussion über typischere JPEG-Größen.

Der Pixelspeicherplatz für ein 640 × 480 32-Bit-Bitmap-Bild kann wie folgt berechnet werden (basierend auf dieser Antwort, aber korrigiert basierend auf dem Kommentar von Ignacio Vazquez-Abrams und dieser Antwort):

Angenommen, die Datei wurde nicht komprimiert, sind 307.200 Pixel vorhanden, was 0,3 MP entspricht. Handlicher Nachschlagetisch

Wenn jedes Pixel 32 Informationsbits enthält, dann

  1. 307.200 * 32 = 9.830.400 Informationsbits
  2. Teilen Sie durch die 8 Bits, um einen Bytewert zu erhalten
  3. 9.830.400 / 8 = 1228800 Byte (oder 1,17 MB)

Dies ist die Größe einer unkomprimierten Bitmap und sollte daher eine Obergrenze für die Größe der JPEG-Datei sein (in Wirklichkeit, da das JPEG-Format die Komprimierung verwendet) , sollten Ihre Bilder viel kleiner sein, insbesondere wenn Sie Nachtaufnahmen machen Himmel, der meiner Meinung nach viel Schwarz enthält. Beachten Sie, dass das größte Beispielbild in Ihrer Frage nur 0,14 MB beträgt.

In Bezug auf Ihr spezielles Problem sind jedoch selbst bei Verwendung dieser Obergrenze von 100 Bildern nur 117 MB, und es ist lange her, dass ich eine Speicherkarte gesehen habe, die so klein wie 128 MB ist. Ich vermute, dass eine derzeit verfügbare Speicherkarte über genügend Kapazität verfügt, um Ihre Anforderungen zu erfüllen.

Anscheinend ist das Problem der maximalen JPEG-Dateigröße umstritten. Diese Stack Overflow-Antwort schlägt eine theoretische Maximalgröße von 20,25 Byte pro Pixel oder 5,9 MB in Ihrem Fall vor. Die Erstellung eines Bildes dieser Größe erfordert jedoch den absichtlichen Missbrauch des Komprimierungsschemas des JPEG-Formats eine Sache, die von einer Kamera produziert wird.

ForeverWintr
quelle
1
Leider ist auch der unkomprimierte Bitmap-Wert nur ein bisschen niedrig, da er das Packen übernimmt. Eine entpackte Bitmap verwendet (aus Ausrichtungsgründen ) 32 Bit pro Pixel , wodurch die Dateigröße um 33% erhöht wird.
Ignacio Vazquez-Abrams
Vielen Dank @ IgnacioVazquez-Abrams. Ich gehe davon aus, dass eine akzeptierte Antwort richtig ist.
ForeverWintr
1
@ IgnacioVazquez-Abrams - "Alignment" ist ein Attribut, das vom Prozessor (nicht vom Speichermedium) vorgegeben wird. Es ist praktisch, wenn sich die Daten zur Verarbeitung im RAM befinden. Für Speicherzwecke ist eine 32-Bit-Wortausrichtung keine Notwendigkeit und sicherlich eine Extravaganz. Das Packen von Daten ist eine übliche Operation vor dem Schreiben in den Speicher, insbesondere für bestimmte Einsparungen von 25%. Ich habe Digitalkameras gesehen, die jedes Pixel in genau 3 Bytes für das Rohformat speichern.
Sägemehl
1
"... sicherlich eine Extravaganz." Heutzutage. Vor vielen Monden galt es als eine zyklussparende Funktion (es ist nicht erforderlich, sich an der Last auszurichten, wenn man bedenkt, wie lange es dauern würde).
Ignacio Vazquez-Abrams
3
In der Praxis, während einige Systeme könnten RGB - Daten Bild speichern als 4 pro Pixel - Bytes im Speicher , so ziemlich alle Bilddateiformate verwenden 3 Bytes pro Pixel höchstens (es sei denn es einen tatsächlichen Alpha - Kanal im vierten Byte gespeichert ist). Siehe meine Antwort unten.
Ilmari Karonen
35

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
(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 pnmtojpegHandbuch nicht klar erklärt, wie alle relevanten Optionen festgelegt werden (die -sampleOption 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
(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 pnmtojpegStandardeinstellungen (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
(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 .

Ilmari Karonen
quelle
4
Theoretisch nur für verlustfreie Komprimierung inkomprimierbar, oder?
Daniel Beck
1
@ DanielBeck: Richtig. Natürlich können Sie alle Daten beliebig komprimieren, wenn Sie bereit sind, nur Teile davon wegzuwerfen. (JPEG - Komprimierung funktioniert im Grunde genommen so, dass die verlorenen Teile für das menschliche Auge nicht wahrnehmbar sind und das verbleibende Bild kompakt codiert werden kann Das einzige, was selbst ein verlustbehafteter Komprimierungsalgorithmus mit Rauschen tun kann, ist, Teile davon wegzuwerfen.)
Ilmari Karonen
Vielleicht bin das nur ich, aber das zweite Bild sieht heller aus als das erste.
Bogdacutu
@ Bogdacutu: Das sollte nicht sein, obwohl es immer möglich ist, dass Ihr Browser etwas seltsames mit dem Farbmanagement usw. tut. Versuchen Sie, beide in einen Grafikeditor zu laden und die Farbwerte zu vergleichen.
Ilmari Karonen
Netter Bericht @Ilmari.
ForeverWintr