
Angenommen, ich habe eine verlustfreie Version eines Bilds, das zuvor im JPEG-Format komprimiert wurde (wenn Sie beispielsweise ein JPEG-Bild in mspaint öffnen und es als BMP speichern, weiß ich, dass bei diesem Vorgang einige Metadaten verloren gehen würden, aber das ist nicht mein Problem).
Ich würde gerne wissen, ob das möglich ist und wie man es ohne Verlust der Bildqualität wieder in das JPEG-Format konvertiert, d. h., dass jedes Pixel genau gleich ist?
BEARBEITEN:Mir ist völlig klar, dass die Konvertierung eines JPEG-Bilds in ein verlustfreies Format mir keine bessere Qualität bringt. Ich frage das, weil: Ich eine PNG-Datei habe, die aus einer SWF-Datei extrahiert wurde. Ursprünglich (in der SWF-Datei) war das Objekt ein JPEG-Bild + Alphakanal, dessen Dateigröße im Vergleich zu meiner PNG-Datei viel kleiner ist. Ich möchte das Originalformat (JPEG + Alphakanal), habe aber keine Kopien der ursprünglichen SWF-Datei mehr (und konnte auch keine online finden), sodass ich den Extraktionsprozess nicht wiederholen kann.
Antwort1
Sie fragen im Wesentlichen, ob der Dekodierungsprozess eines JPEG-Bildes rückgängig gemacht werden kann. Dies ist eine ganz andere Absicht als die eines herkömmlichen JPEG-Encoders, undMir ist keine Software bekannt, die dies leistet.Mathematisch ist dies möglich*, solange auf das Bild nach der Kodierung keine Transformation oder sonstige Änderung angewendet wurde, aber wie schwierig könnte es programmtechnisch sein?
Das erste Problem ist der Farbraum – JPEG verwendet unterabgetastetes (die Farbe wird über eine Gruppe von Pixeln abgetastet) yCbCr, während eine Bitmap RGB ist. Unvermeidliche Verluste bei der Konvertierung zwischen diesen Farbräumen (und auch bei jeder Gammaanpassung) führen zu Rauschen. Das zweite zu lösende Problem besteht darin, dass JPEG die Bilddaten als Makroblöcke (Unterbilder der Größe NxN) aufzeichnet, die aus dem Ausgabebild des Decoders abgeleitet werden müssen. Eine ausführlichere Erklärung des JPEG-Formats und des Kodierungsprozesses finden Sie hierhttp://www.guillermito2.net/stegano/jsteg/
„Rückdekodieren“ eines JPEG:
Um eine Annäherung an die ursprünglichen JPEG-Daten zu erstellen, müssen wir die Unterabtastung, Größe und Ausrichtung der Makroblöcke sowie die Koeffizienten der diskreten Kosinustransformation (DCT) ermitteln, die zur Kodierung verwendet wurden. Der Rest ist identisch mit einem normalen JPEG-Kodierungsprozess. Eine naive Implementierung, die mir in den Sinn kommt, ist „fundiertes Raten und Prüfen“: Nehmen Sie an, dass einige gängige JPEG-Implementierungen zur Erstellung des Bildes verwendet wurden, und versuchen Sie, diese anzuwenden, bis eine gefunden wird, die „JPEG-ähnliche“ Ergebnisse aus der DCT liefert (normalerweise Nullen für hohe Frequenzen).
Anschließend werden die Koeffizienten so feinabgestimmt, dass der Fehler im Vergleich zum Original (also der Bitmap des komprimierten Bildes) minimal bleibt. Dieser Vorgang führt zwar immer noch zu einem Kompromiss zwischen Fehler und Dateigröße, sollte aber für praktische Zwecke nahe genug herankommen.
Quelle: Frühere Beschäftigung mit der Überprüfung von DNx- und ProRes-Videocodecs, die eine JPEG-ähnliche Kodierung auf jedes einzelne Frame anwenden (eine Software zum Umkehren dekodierter Frames wäre ein sehr interessantes und potenziell nützliches Nebenprojekt gewesen).
* Es ist ein Satz von Eingabedaten vorhanden, der beim Durchlaufen des ursprünglichen JPEG-Decoders eine identische Ausgabe erzeugt. Es ist jedoch höchst unwahrscheinlich, dass bei einer Rekonstruktion eine byteweise Kopie (unter Ignorierung der Metadaten) der Originaldatei entsteht, da beim Decodiervorgang Informationen verloren gegangen sind.
Antwort2
JPEG ist ein verlustbehaftetes Format und daran führt kein Weg vorbei. Selbst bei einer Komprimierungsqualität von 100 beträgt das Komprimierungsverhältnis immer noch 2,6:1 (Wikipedia JPEG).
Es wurden einige Varianten vorgeschlagen fürVerlustfreies JPEG, wie JPEG 2000, haben sich jedoch nicht durchgesetzt und ihre Unterstützung ist sehr dürftig.
Besser wäre es, in ein verlustfreies Format zu konvertieren, wie PNG, das zwar immer noch komprimiert, jedoch ohne Verluste.
Antwort3
Wenn Sie ein JPEG-Bild mit einem beliebigen Editor öffnen und es als BMP speichern, erhalten Sie keine bessere Qualität als die, die bereits in Ihrer .jpg
Datei vorhanden ist. Das wäre, als würden Sie eine MP3-Datei mit niedriger Bitrate (z. B. 128 kbps) in ein viel besseres Format wie konvertieren flac
und hoffen, dass die Qualität auf magische Weise wiederhergestellt wird. Das wird nicht passieren.
Wie harrymc bereits sagte, gingen beim ersten Speichern des Bilds im JPG-Format Informationen verloren. Aus dieser JPG-Datei lassen sich diese Informationen nicht mehr zurückgewinnen.
Verlustbehaftete Kompression ist „destruktiv“ oder auch „irreversibel“ genannt. Siehehttps://en.wikipedia.org/wiki/Verlustbehaftete_Kompression.
Antwort4
Bei der Konvertierung in ein JPEG gingen mit ziemlicher Sicherheit Informationen verloren. Bei der Konvertierung dieser Datei in ein BMP bleiben die im JPEG gespeicherten Informationen erhalten, aber bei der Rückkonvertierung des BMP in ein JPEG gehen wahrscheinlich noch mehr Informationen verloren.