Ist es möglich, das Qualitätsniveau eines JPEG zu bestimmen?

73

Dies ist wirklich eine zweiteilige Frage, da ich noch nicht ganz verstehe, wie diese Dinge funktionieren:

Meine Situation: Ich schreibe eine Web-App, mit der der Benutzer ein Bild hochladen kann. Meine App ändert dann die Größe auf etwas Anzeigefähiges (z. B. 640 x 480) und speichert die Datei zur späteren Verwendung.

Meine Fragen:

  1. Ist es bei einer beliebigen JPEG-Datei möglich, die Qualitätsstufe zu bestimmen, damit ich beim Speichern des Bildes mit geänderter Größe dieselbe Qualität verwenden kann?
  2. Ist das überhaupt wichtig? Sollte ich alle Bilder unabhängig von der Originalqualität auf einem anständigen Niveau speichern (z. B. 75-80)?

Ich bin mir da nicht so sicher, denn wie ich es mir vorstelle: (Nehmen wir ein extremes Beispiel) Wenn jemand ein 5-Megapixel-Bild mit der Qualität 0 gespeichert hätte, wäre es wie alles andere blockig. Wenn die Bildgröße auf 640 x 480 reduziert wird, wird die Blockierung geglättet und kaum weniger ... bis ich sie wieder mit der Qualität 0 gespeichert habe ...

Wenn am anderen Ende des Spektrums ein Bild mit einer Größe von 800 x 600 und q = 0 vorhanden wäre, ändert die Größenänderung auf 640 x 480 nichts an der Tatsache, dass es wie völliger Mist aussieht. Daher wäre das Speichern mit q = 80 überflüssig.

Bin ich überhaupt in der Nähe?

Ich verwende die GD2-Bibliothek unter PHP, wenn dies von Nutzen ist

nickf
quelle
2
nickf Könnten Sie bitte die Antwort von @ DuyLuc akzeptieren, die das Identifizierungsformat '% Q' verwendet? Es beantwortet das Problem im Gegensatz zur derzeit akzeptierten Antwort. Ich habe es gerade mit meinen Dateien versucht und es funktioniert. Vielen Dank!
Alex I

Antworten:

27
  1. JPEG ist ein verlustbehaftetes Format. Jedes Mal, wenn Sie ein JPEG-Bild unabhängig von der Qualitätsstufe speichern, wird die tatsächliche Bildqualität verringert. Selbst wenn Sie eine Qualitätsstufe aus der Datei erhalten hätten, könnten Sie diese Qualität nicht beibehalten, wenn Sie ein JPEG erneut speichern (selbst bei Qualität = 100).

  2. Sie sollten Ihr JPEG in einer Qualität speichern, die Sie sich in Bezug auf die Dateigröße leisten können. Oder verwenden Sie ein verlustfreies Format wie PNG.

JPEG-Dateien mit geringer Qualität werden nicht einfach blockiger. Stattdessen wird die Farbtiefe reduziert und die Details der Bildabschnitte werden entfernt. Sie können sich nicht darauf verlassen, dass Bilder mit geringerer Qualität blockartig sind und bei kleineren Größen gut aussehen.

Gemäß der JFIF-Spezifikation. Die Qualitätsnummer (0-100) wird nicht im Bildheader gespeichert, obwohl die horizontale und vertikale Pixeldichte gespeichert ist.

Asche
quelle
5
+1, es ist im Allgemeinen richtig, dass das Speichern eines JPEG die Qualität tendenziell verringert, aber in einigen eingeschränkten Fällen kann dies umgangen werden - siehe en.wikipedia.org/wiki/Jpeg#Lossless_editing . Zum Beispiel hat Irfanview ein Plugin für verlustfreies JPEG-Zuschneiden / Drehen.
j_random_hacker
Weißt du, ob das auch für MPEG-Videos gilt?
Johnny
@johnny, MPEG2 (und ich glaube, MPEG4) verwendet ebenfalls verlustbehaftete Komprimierung, sodass eine mehrfache Neucodierung die Qualität verringert. Ich bin mir nicht sicher, ob die Komprimierungsstufe in den MPEG-Headern gespeichert ist.
Ash
Die einzigen Stellen im Komprimierungsprozess, an denen tatsächlich ein Verlust auftritt, sind (potenziell) Rundungsfehler und der Quantisierungsschritt. Wenn die Quatisierung identisch durchgeführt werden kann und die Berechnung mit ausreichender Genauigkeit durchgeführt wird, kann garantiert werden, dass die Qualität nicht abnimmt. Das Hauptproblem hierbei ist, dass der Standard AFAIK nicht genau definiert, wie der Quantisierungsschritt durchgeführt werden soll Wir müssten bestimmte Vermutungen für Dateien anstellen, die nicht mit einem bekannten Encoder codiert sind. In der Praxis gibt es natürlich noch andere Faktoren, aber für den Anwendungsfall des OP ist dies zumindest technisch machbar.
Tim Seguine
2
Wie kann diese Antwort die Lösung sein? Es beantwortet die Frage überhaupt nicht.
BasZero
119

Sie können die Komprimierungsstufe mit ImageMagick anzeigen. Anweisungen zum Herunterladen und Installieren finden Sie auf der offiziellen Website .

Führen Sie nach der Installation den folgenden Befehl über die Befehlszeile aus:

identify -format '%Q' yourimage.jpg

Und Sie sollten den Wert von 0 (niedrige Qualität, kleine Dateigröße) bis 100 (hohe Qualität, große Dateigröße) erhalten.

Informationsquelle

DuyLuc
quelle
2
Das spezifische Element, nach dem Sie in der Ausgabe suchen, ist das Element Qualität:, das direkt vor dem Abschnitt Eigenschaften: mit allen EXIF-Daten angezeigt wird. Bei maximaler Qualität beträgt dieser Wert 100.
Oran Dennison
4
@OranDennison Ihr Kommentar war mehrdeutig genug, um mich nach einem "Qualitäts" -Tag in EXIF-Daten zu suchen. Aber es gibt nicht: "Qualität" ist ein Merkmal der identify -verboseAusgabe.
Skippy le Grand Gourou
4
Ich verstehe nicht, warum diese Antwort nicht als Lösung markiert wurde ??? Es nagelt es wirklich ohne Blabla fest.
BasZero
12

Für zukünftige Besucher, die die Qualität eines bestimmten JPEGs überprüfen, können Sie einfach Imagemagick-Tools verwenden:

$> identify -format '%Q' filename.jpg
   92%
JAR.JAR.beans
quelle
3
Wow, ImageMagick gibt Ihnen sogar RGB-Kanal-Kurtosis und Schiefe und ob es interlaced ist! Ich benutze die identityganze Zeit, aber nie mit der -verboseOption. Sehr hilfreich.
Clint Pachl
8

Der JPEG-Komprimierungsalgorithmus verfügt über einige Parameter, die die Qualität des Ergebnisbilds beeinflussen.

Einer dieser Parameter sind Quantisierungstabellen, die definieren, wie viele Bits für jeden Koeffizienten verwendet werden. Unterschiedliche Programme verwenden unterschiedliche Quatisierungstabellen.

Bei einigen Programmen kann der Benutzer die Qualitätsstufe 0-100 einstellen. Es gibt jedoch keine gemeinsame Verteidigung dieser Zahl. Das mit Photoshop mit 60% Qualität erstellte Bild benötigt 46 KB, während das mit GIMP erstellte Bild nur 26 KB benötigt.

Quantisierungstabellen sind ebenfalls unterschiedlich.

Es gibt andere Parameter wie Unterabtastung, DCT-Methode usw.

Sie können also nicht alle anhand einer einzelnen Qualitätsstufe beschreiben und die Qualität von JPEG-Bildern nicht anhand einer einzelnen Nummer vergleichen. Sie können jedoch eine solche Zahl wie Photoshop oder Gimp erstellen, die einen Kompromiss zwischen Größe und Qualität beschreibt.

Weitere Informationen: http://patrakov.blogspot.com/2008/12/jpeg-quality-is-meaningless-number.html

Es ist üblich, das Bild auf die entsprechende Größe zu ändern und danach JPEG anzuwenden. In diesem Fall haben große und mittlere Bilder die gleiche Größe und Qualität.

ton4eg
quelle
6

Da bereits zwei Antworten verwendet werden identify, gibt es hier eine, die auch den Dateinamen ausgibt (zum gleichzeitigen Scannen mehrerer Dateien) :

Wenn Sie eine einfache Ausgabe filename: qualityfür mehrere Bilder wünschen , können Sie diese verwenden

identify -format '%f: %Q' *

auf die Dateinamen + Komprimierung zeigt alle Dateien im aktuellen Verzeichnis.

serv-inc
quelle
3

Grundsätzlich gibt es zwei Fälle, die Sie interessieren:

  1. Wenn für ein eingehendes Bild die Qualität zu hoch eingestellt ist, nimmt es möglicherweise unangemessen viel Platz ein. Daher möchten Sie beispielsweise das eingehende q = 99 auf q = 85 reduzieren.

  2. Wenn für ein eingehendes Bild die Qualität zu niedrig eingestellt ist, kann es eine Platzverschwendung sein, die Qualität zu erhöhen. Abgesehen davon, dass ein Bild, bei dem eine große Datenmenge verworfen wurde, nicht magisch mehr Speicherplatz beansprucht, wenn die Qualität erhöht wird - blockartige Bilder werden auch bei hohen Qualitätseinstellungen sehr gut komprimiert. Meiner Meinung nach ist es also vollkommen in Ordnung, eingehende q = 1 auf q = 85 zu erhöhen.

Aus diesem Grund würde ich denken, dass es durchaus akzeptabel ist, einfach eine anständige Qualitätseinstellung zu erzwingen.

Eric Seppanen
quelle
3
Mir ist klar, dass dies ein ziemlich alter Thread ist, aber Ihr zweiter Punkt ist nicht korrekt. Komprimierte Bilder beanspruchen beim erneuten Komprimieren häufig mehr Platz .
Ben D
@BenD Wenn Sie die Qualität zwischen den Komprimierungen erhöhen, erhalten Sie auf magische Weise keine Frequenzkomponenten, die in der ersten komprimierten Datei nicht enthalten waren. Wenn dies in der Praxis geschieht, ist der Kompressor nicht sehr intelligent, da die Daten a priori bereits angemessen quantisiert sind. Ich denke, das Problem hier ist, dass der Standard kleine Unterschiede im dekodierten Bild zulässt, das dann beim zweiten Mal eine möglicherweise andere DCT aufweist. Mit einer entsprechend codierten JPEG-Bibliothek sollte der Punkt 2 theoretisch UND in der Praxis möglich sein.
Tim Seguine
1
@Tim Ich verstehe Ihre Kritik vielleicht falsch, aber ich glaube, dass Sie in diesem Punkt falsch liegen. Da JPEG-Komprimierungen häufig zu Rauschen führen und das resultierende JPEG nicht die aktuelle Komprimierungsstufe speichert, sind sekundäre Komprimierungen (dh Original -> Qualität = 60 -> Qualität = 80) häufig größer als die primäre Komprimierung. Ich habe diesen Test sowohl mit GD- als auch mit Desktop-Kompressoren ausgeführt (siehe meinen ursprünglichen Link). Da der Kompressor den aktuellen Komprimierungsstatus des Bildes nicht kennen kann, kann er beim Ausführen nachfolgender Komprimierungen nicht intelligent sein. Wenn Sie einen Weg kennen, würde ich das gerne wissen.
Ben D
1
@BenD Das größte Problem hierbei ist der Quantisierungsschritt bei der Komprimierung. Wenn Sie keine genauen Details über den verwendeten Kompressor kennen, ist es möglicherweise unmöglich, die während der Quantisierung erzielten Kompromisse zu erraten. Da der Standard eine Differenz von 1 Bit pro Block IIRC während der Dekomprimierung zulässt und die DCT nicht mit perfekter Rundungsgenauigkeit durchgeführt werden muss, haben Sie größtenteils Recht. Dies sind jedoch nur praktische Probleme. Wenn Sie ein JPEG mit Genauigkeit bis zum Maschinen-Epsilon dekomprimieren und dann die DCT erneut ohne Quantisierung durchführen,
Tim Seguine
1
Dies ist eine faszinierende Diskussion. Es macht mir fast nichts aus, dass meine ursprüngliche Antwort falsch ist. :)
Eric Seppanen
3

Hier ist eine Formel, die sich als gut erwiesen hat:

  1. jpg100size (die Größe, die für 98-100% Qualität nicht in Byte überschritten werden sollte) = width * height / 1.7

  2. jpgxsize = jpg100size * x (x = Prozent, z. B. 0,65)

Sie können diese also verwenden, um statistisch herauszufinden, in welcher Qualität Ihr JPG zuletzt gespeichert wurde. Wenn Sie die Qualität auf 65% reduzieren möchten und ein erneutes Abtasten vermeiden möchten, sollten Sie die Größe zunächst vergleichen, um sicherzustellen, dass sie nicht bereits zu niedrig ist, und erst dann die Qualität verringern

Raul Popa
quelle
Es ist cool zu sehen, dass jemand anderes mit der gleichen Idee wie ich herumgespielt hat. Ich versuche herauszufinden, welche Größe für ein JPEG- (oder PNG-) Bild "gut" ist, wenn es in unserem CMS verwendet wird. Ich habe einige Statistiken darüber erstellt, was sich bereits in unserer Datenbank befindet, und ich habe auch mit einigen Zahlen herumgespielt. Ab sofort werde ich Benutzer warnen, die ein JPEG-Bild hochladen, das größer als 4K und 32x32 Pixel ist und eine hat Bereich: Byte-Verhältnis <1.
Elgholm
2
Raul, wie hast du den 1.7Koeffizienten berechnet ?
Hassan Baig
eher wie Versuch und Irrtum, aber es war sehr nah für eine gerade lineare Formel
Raul Popa
2

Jedes neue Speichern der Datei verringert die Gesamtqualität weiter. Durch die Verwendung höherer Qualitätswerte erhalten Sie mehr Bild. Unabhängig von der ursprünglichen Bildqualität.

Alexander Taran
quelle
1

Wenn Sie ein JPEG mit derselben Software, mit der es ursprünglich erstellt wurde, mit denselben Einstellungen erneut speichern, werden Sie feststellen, dass der Schaden minimiert ist. Der Algorithmus wirft in der Regel dieselben Informationen aus, die er beim ersten Mal ausgegeben hat. Ich glaube nicht, dass es eine Möglichkeit gibt, herauszufinden, welche Ebene ausgewählt wurde, indem man sich nur die Datei ansieht. Selbst wenn Sie könnten, garantiert unterschiedliche Software fast unterschiedliche Parameter und Rundungen, was eine Übereinstimmung fast unmöglich macht.

Mark Ransom
quelle
1

Dies mag eine dumme Frage sein, aber warum sollten Sie sich Gedanken über das Mikromanagement der Qualität des Dokuments machen? Ich glaube, wenn Sie ImageMagick für die Konvertierung verwenden, wird die Qualität des JPEG für Sie optimal verwaltet. http://www.php.net/manual/en/intro.imagick.php

bryanjonker
quelle
Ich möchte manchmal sicherstellen, dass ein Künstler tatsächlich ein unkomprimiertes Bild liefert (mehrmals haben sie mir versehentlich ein komprimiertes JPEG gegeben).
David Dunham