Monthly Archives: März 2019

Mission impossible – Jpeg File Size Prediction

Vorhersage der Filegröße von JPEGs verschiedener Größe erweist sich als sehr unsicher.

tdlr; Eine Vorausberechnung scheint nicht möglich – es bleibt nur eine wiederholte „Testberechnung“ mit einer Optimierungslogik für die Skalierung.

Für die Monochrom-App – eine App zur Umsetzung von Leica-DNG Dateien in Schwarz-Weiß-Bilder – wünschte man sich eine Funktion zur Erstellung von Jpegs mit einer vorbestimmten Größe in Kilobyte.

Viele Foren sehen eine Begrenzung der Uploadgröße vor. Vorausgesetzt man möchte keine Qualitätsabstriche machen (mein Standard für JPEG Qualität ist 93 von 100), so muss die Pixelzahl durch Veränderung der Seitenmaße (bei Erhalt deren Verhältnisses) angepasst werden.

Schön wäre es, diese Seitenlängen im Vorhinein ausrechnen zu können — geht aber leider nicht. Der Jpeg-Standard verknüpft verschiedene Komprimierungswege, die darüber hinaus durchaus standardgerecht relativ frei kombiniert werden können (https://en.wikipedia.org/wiki/JPEG), namentlich Colorspace Conversion, Downsampling, Discrete Cosine Transformation, Quantization und anschließendes Entropy Encoding.

Aus meinem DNG-Bestand habe ich 631 .DNG Dateien mit 6000x4000px in monchrome Bilder umgerechnet und auf längste Bildseiten mit 100, 200, 500, 1000, 1500, 2000, 2500, 3000, 3500, 4000 Pixeln skaliert (entsprechend 6666, 26666, 166666, 666666, 1.5 mio, 2.666 mio, 4.166 mio, 6 mio, 8.166 mio und 10.666 mio Bildpixeln)

In der Folge ergibt sich, dass die Bilddateigröße sich nicht sicher voraussagen läßt, wenn man die Pixelzahl durch Lanczos3-Skalierung in 1/4 Schritten verringert (Halbierung der Langs- und Breitseite).


Die Linien zeigen die Größenveränderung der resultierenden Jpeg-Datei aus Leica-DNG nach monochrom-Umwandlung bei unterschiedlichen längsten Bildseiten (px100 — px4000) mithilfe Lanczos3-Skalierung

Obenstehender Grafik ist die Veränderung der Dateigröße bei unterschiedlicher Skalierung einzelner Bilddateien (farbige Linien) zu entnehmen. Es deutet sich schon an, dass kein linearer Zusammenhang besteht. R-Plus ergibt einen exponentiellen fit mit R**2 zwischen 0.8 und 0.9 von einzelnen Längseitenlängen zum nächsten Halbierungsschritt (i.e. px2000 -> px1000). Die Genauigkeit reicht nicht für eine saubere Vorhersage der Bilddateigröße.


Box-and-Whiskerplots der Dateigröße von
N=631 Leica .DNG 6000×4000 -> Jpeg Grautöne (Black&White) skaliert (
Lanczos3) auf verschiedene längste Seitenlängen (px100 — px4000)
Die rote Linie bei 500 KB zeigt das Uploadlimit des deutschen LUF.

Die rote Linie bei 500 KB in oben stehender Grafik zeigt das Uploadlimit des deutschen LUF. Wie zu erkennen ist, kann die Länge der Längsseite eines 500MB Jpeg (Q93, mit 8 Bit Grautönen) demnach zwischen px1000 und px3500 liegen – je nach Bildkomposition.

Was bleibt:

Berechnung jeder einzelnen Jpeg-Datei und Ermittlung der Dateigröße, Optimierungslogik anhand des Fehlers und Annäherung an eine geeignete Pixelzahl in asymmetrischen Schrittlängen*Fehlercoeff.

Etwa so:

Zielgröße: 490000 jpeg: 744593 width: 1802.2019 err^2: -0.0051
Zielgröße: 490000 jpeg: 616205 width: 1785.2429 err^2: -0.0025
Zielgröße: 490000 jpeg: 605390 width: 1778.2429 err^2: -0.0023
Zielgröße: 490000 jpeg: 600989 width: 1765.2429 err^2: -0.0022
Zielgröße: 490000 jpeg: 592734 width: 1704.2429 err^2: -0.0020
Zielgröße: 490000 jpeg: 555151 width: 1701.2429 err^2: -0.0013
Zielgröße: 490000 jpeg: 554161 width: 1664.2429 err^2: -0.0013
Zielgröße: 490000 jpeg: 529685 width: 1551.2429 err^2: -0.0008
Zielgröße: 490000 jpeg: 466955 width: 1648.2429 err^2: 0.0004
Zielgröße: 490000 jpeg: 521434 width: 1631.2429 err^2: -0.0006
Zielgröße: 490000 jpeg: 512253 width: 1624.2429 err^2: -0.0004
Zielgröße: 490000 jpeg: 508231 width: 1611.2429 err^2: -0.0003
Zielgröße: 490000 jpeg: 500654 width: 1550.2429 err^2: -0.0002
Zielgröße: 490000 jpeg: 466785 width: 1553.2429 err^2: 0.0004
Zielgröße: 490000 jpeg: 468561 width: 1590.2429 err^2: 0.0004
Zielgröße: 490000 jpeg: 487857 width: 1703.2429 err^2: 4.3e-05

auf Kosten der Dauer: 3.35 sec anstatt 1.45 sec (einschließlich der B&W Konversion)