91 Stimmen

Ist es möglich, die Qualitätsstufe eines JPEGs zu bestimmen?

Dies ist eigentlich 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 anzeigbar (z. B. 640x480-ish) und speichert die Datei zur späteren Verwendung.

Meine Fragen:

  1. Ist es möglich, aus einer beliebigen JPEG-Datei die Qualitätsstufe zu ermitteln, so dass ich beim Speichern des verkleinerten Bildes dieselbe Qualität verwenden kann?
  2. Ist das überhaupt von Bedeutung? Sollte ich alle Bilder mit einer angemessenen Stufe (z. B. 75-80) speichern, unabhängig von der ursprünglichen Qualität?

Ich bin mir da nicht so sicher, denn ich denke, wenn jemand ein 5-Megapixel-Bild mit der Qualität 0 speichern würde, wäre es so blockig wie möglich. Bei einer Verkleinerung des Bildes auf 640x480 würde die Blockhaftigkeit geglättet werden und kaum weniger auffällig... bis ich es wieder mit Qualität 0 gespeichert habe...

Am anderen Ende des Spektrums, wenn es ein Bild mit 800x600 und q=0 gibt, wird die Größenänderung auf 640x480 nichts daran ändern, dass es wie völliger Mist aussieht, also wäre das Speichern mit q=80 überflüssig.

Bin ich überhaupt nah dran?

Ich verwende die GD2-Bibliothek auf PHP, falls das von Nutzen ist

3voto

Mark Ransom Punkte 283960

Wenn Sie ein JPEG mit derselben Software, mit der es ursprünglich erstellt wurde, und mit denselben Einstellungen erneut speichern, werden Sie feststellen, dass sich der Schaden in Grenzen hält - der Algorithmus wird dazu neigen, dieselben Informationen zu verwerfen, die er beim ersten Mal verworfen hat. Ich glaube nicht, dass es eine Möglichkeit gibt, herauszufinden, welche Stufe ausgewählt wurde, indem man sich die Datei ansieht; selbst wenn man es könnte, ist es fast garantiert, dass verschiedene Software unterschiedliche Parameter und Rundungen verwendet, was eine Übereinstimmung fast unmöglich macht.

3voto

Eric Seppanen Punkte 5773

Es gibt also im Wesentlichen zwei Fälle, die Sie interessieren:

  1. Wenn die Qualität eines eingehenden Bildes zu hoch eingestellt ist, kann es eine unangemessene Menge an Speicherplatz beanspruchen. Daher sollten Sie z. B. das eingehende q=99 auf q=85 reduzieren.

  2. Wenn die Qualität eines eingehenden Bildes zu niedrig eingestellt ist, kann es eine Platzverschwendung sein, die Qualität zu erhöhen. Allerdings wird ein Bild, bei dem eine große Menge an Daten verworfen wurde, nicht auf magische Weise mehr Platz beanspruchen, wenn die Qualität erhöht wird - blockige Bilder werden auch bei hohen Qualitätseinstellungen sehr gut komprimiert. Meiner Meinung nach ist es also völlig in Ordnung, die eingehenden q=1 auf q=85 zu erhöhen.

Von daher würde ich denken, dass es völlig in Ordnung ist, einfach eine vernünftige Qualitätseinstellung zu erzwingen.

2voto

Alexander Taran Punkte 6545

Mit jedem neuen Speichern der Datei nimmt die Gesamtqualität weiter ab. Wenn Sie höhere Qualitätswerte verwenden, bleibt mehr vom Bild erhalten. Unabhängig davon, wie die ursprüngliche Bildqualität war.

2voto

bryanjonker Punkte 3341

Das mag eine dumme Frage sein, aber warum sollten Sie sich Sorgen machen, die Qualität des Dokuments im Detail zu kontrollieren? Ich glaube, wenn Sie ImageMagick für die Konvertierung verwenden, wird es die Qualität des JPEGs für Sie verwalten, um den besten Effekt zu erzielen. http://www.php.net/manual/en/intro.imagick.php

2voto

jtlz2 Punkte 5993

Hier sind einige Möglichkeiten, wie Sie Ihr Ziel (1) erreichen und es richtig machen können.

  1. Es gibt Möglichkeiten, dies durch Anpassung an die Quantisierungstabellen zu erreichen. Sherloq - zum Beispiel - tut dies:

    https://github.com/GuidoBartoli/sherloq

    Der entsprechende (Python)-Code befindet sich unter https://github.com/GuidoBartoli/sherloq/blob/master/gui/quality.py

  2. Es gibt einen weiteren Algorithmus, der in https://arxiv.org/abs/1802.00992 - Sie könnten sich mit dem Autor in Verbindung setzen, um den Code zu erhalten.

  3. Sie können auch Folgendes simulieren file_size(image_dimensions,quality_level) und dann diese Funktion/Lookup-Tabelle invertieren, um Folgendes zu erhalten quality_level(image_dimensions,file_size) . Hey presto!

  4. Schließlich können Sie eine Brute-Force-Methode anwenden https://en.wikipedia.org/wiki/Error_level_analysis Ansatz, bei dem die Differenz zwischen dem Originalbild und den neu komprimierten Versionen berechnet wird, die jeweils mit einer anderen Qualitätsstufe gespeichert wurden. Die Qualitätsstufe des Originals ist ungefähr diejenige, bei der die Differenz am geringsten ist. Scheint recht gut zu funktionieren (ist aber linear in der for-Schleife ).

Meistens wird ein Qualitätsfaktor von 75 oder 95 verwendet, der Ihnen helfen könnte, schneller zum Ergebnis zu kommen. Wahrscheinlich würde niemand ein JPEG mit 100 speichern. Wahrscheinlich würde es auch niemand sinnvollerweise mit < 60 speichern.

Ich kann weitere Links hinzufügen, sobald sie verfügbar sind - bitte schreiben Sie sie in die Kommentare.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X