Können wir die Größe eines JPEG-Bildes ändern, ohne es zu dekodieren und neu zu kodieren?

12

Ich möchte ein 640x480 JPEG-Bild in 320x240 konvertieren. Ich weiß, dass dies durch Dekodieren des JPEG-Bildes in YCbCr-Rohdaten, durch Skalieren und erneutes Kodieren in JPEG erreicht werden kann. Aber ist es mit der JPEG-Kodierung möglich, das Bild ohne Dekodierung direkt zu skalieren?

Necktwi
quelle

Antworten:

14

Dies ist jedoch nur möglich, wenn Ihr JPEG-Viewer die SmartScale JPEG-Erweiterung unterstützt. jpegtran kann dies für Größen von N / 8 mit N = 1..16 tun. Grundsätzlich wird die DCT-Blockgröße während der Rekomprimierung von 8 x 8 auf etwas anderes geändert (z. B. 4x4), wodurch das Bild effektiv skaliert wird.

Hinweis: SmartScale wurde in Version 8 der libjpeg-Bibliothek eingeführt, wird jedoch von den Zuschauern nicht allgemein unterstützt.

Ein Dokument, das die Änderungen im Detail beschreibt, finden Sie hier: Evolution of JPEG .

EDIT: Es scheint, dass die meisten Betrachter diese Bilder nicht anzeigen können, da sie auf libjpeg-turbo basieren. Und libjpeg-turbo hat diese Funktion nicht implementiert . Tatsächlich habe ich einige Programme ausprobiert (unter Ubuntu 14.04 und Windows 8) und keines war in der Lage, das mit jpegtrans erstellte verkleinerte Bild anzuzeigen. Sogar Photoshop, IrfanView und GIMP sind gescheitert.

EDIT 2: Ubuntu und Fedora liefern nicht einmal die libjpeg8-Bibliothek aus, sondern ersetzen sie vollständig durch die libjpeg-turbo-Version. Keines der Programme kann JPEG SmartScale-Dateien lesen, außer ein paar Binärdateien, die statisch mit der ursprünglichen libjpeg8-Bibliothek verknüpft sind.

jmiserez
quelle
Gibt es einen Codec, der das Bild erstellt, das nur durch Anhängen weiterer Daten an das Bild wächst?
Necktwi
was ist mit dem progressiven JPEG? Tut es nicht genau das, was ich frage?
Necktwi
Nein, das ändert sich geringfügig, indem die Bildqualität erhöht wird (von niedrig auf voll), aber die Auflösung bleibt immer unverändert ( Referenz ). Es gibt jedoch eine andere JPEG-Erweiterung, die als "hierarchischer Modus" bezeichnet wird und unterschiedliche Auflösungen codiert ( siehe auch hier ). Aber libjpeg-turbo unterstützt es auch nicht (siehe hier , suche nach "progressiv" im Text).
JMISEREZ
1
Und um den ersten Kommentar zu beantworten, gibt es natürlich solche Codecs. Nur nicht JPG. Was Sie suchen, wird als Bildpyramide oder Multiskalendarstellung bezeichnet. Beispielsweise verwendet JPEG2000 eine Wavelet-Transformation, die eine Wavelet-Pyramide erzeugt. Es gibt andere Pyramiden, wie zum Beispiel Gauß- oder Laplace-Pyramiden. Dieser Foliensatz gibt einen guten Überblick über die Funktionsweise, während JPEG2000 hier und hier besprochen wird .
Jmiserez
Vielen Dank für die Informationen zu den neuen JPEG-Formaten. Ich erwarte nicht, dass viele Quellbilder (Kameras, Scanner usw.) sie noch verwenden.
AFH
3

Die kurze Antwort lautet nein. Ein JPEG-Bild verwendet eine Komprimierung, was bedeutet, dass jedes Ausgangsbyte von allen anderen abhängt. Wenn Sie die Anzahl der Bildbytes ändern, müssen Sie dekomprimieren und erneut komprimieren.

Die erneute Komprimierung führt zu Qualitätsverlusten, da JPEG eine verlustbehaftete Komprimierung verwendet. Sie verlieren jedoch trotzdem an Qualität, wenn Sie die Auflösung vierteln. Sie können die bestmögliche Qualität des Bildes mit niedriger Auflösung erzielen, indem Sie die JPEG-Qualitätsstufe beim erneuten Komprimieren erhöhen. Dies erhöht jedoch natürlich die Dateigröße.

Wenn Sie viel mit Bildern arbeiten, ist es am besten, in einem verlustfreien Komprimierungsformat wie PNG zu arbeiten, das nur dann in JPEG konvertiert wird, wenn die Bilder finalisiert sind, vorausgesetzt, Sie haben zusätzlichen Speicherplatz.

AFH
quelle