JPEG-Bilder sind ĂŒberall in unserem digitalen Leben zu finden, aber hinter diesem Wissen verbergen sich Algorithmen, die Details eliminieren, die vom menschlichen Auge nicht wahrgenommen werden. Am Ende ergibt sich eine höchst visuelle QualitĂ€t bei der kleinsten DateigröĂe â aber wie funktioniert das konkret? Lassen Sie uns ansehen, was unsere Augen nicht sehen!

Es ist leicht, es als selbstverstĂ€ndlich anzunehmen, ein Foto an einen Freund zu schicken, ohne sich Gedanken darĂŒber zu machen, welches GerĂ€t, welchen Browser oder welches Betriebssystem er verwendet â doch das war nicht immer so. Zu Beginn der 1980er Jahre konnten Computer digitale Bilder speichern und anzeigen, aber es gab viele konkurrierende Ideen, wie man dies am besten tun sollte. Man konnte nicht einfach ein Bild von einem Computer auf einen anderen senden und hoffen, dass alles funktioniert.
Um dieses Problem zu lösen, wurde 1986 ein Komitee von Experten aus der ganzen Welt mit dem Namen ââ (Joint Photographic Experts Group, JPEG) gegrĂŒndet, im Rahmen der Zusammenarbeit der Internationalen Organisation fĂŒr Normung (ISO) und der Internationalen Elektrotechnischen Kommission (IEC) â zweier internationaler Normungsorganisationen mit Sitz in Genf (Schweiz).
Die Gruppe von Menschen, die JPEG genannt wird, schuf 1992 den JPEG-Standard fĂŒr die Kompression digitaler Bilder. Jeder, der das Internet genutzt hat, ist wahrscheinlich auf Bilder im JPEG-Format gestoĂen. Es ist die am weitesten verbreitete Methode zur Kodierung, dem Versand und der Speicherung von Bildern. Von Webseiten bis hin zu E-Mails und sozialen Medien wird JPEG Milliarden von Malen tĂ€glich verwendet â praktisch jedes Mal, wenn wir ein Bild online ansehen oder es senden. Ohne JPEG wĂ€re das Web weniger lebendig, langsamer und wĂŒrde wahrscheinlich weniger Katzenbilder enthalten!
Dieser Artikel handelt davon, wie man ein JPEG-Bild dekodiert. Mit anderen Worten, darĂŒber, was erforderlich ist, um komprimierte Daten, die auf einem Computer gespeichert sind, in ein Bild umzuwandeln, das auf dem Bildschirm erscheint. Das sollte man nicht nur wissen, weil es wichtig ist, die Technologie zu verstehen, die wir tĂ€glich verwenden, sondern auch, weil wir durch das Aufdecken von Komprimierungsebenen besser verstehen, wie wir wahrnehmen und sehen, sowie welche Details unsere Augen am empfindlichsten wahrnehmen.
AuĂerdem macht es viel SpaĂ, mit Bildern auf diese Weise zu experimentieren.

Einen Blick ins Innere von JPEG werfen
Auf einem Computer wird alles als Folge von BinĂ€rzahlen gespeichert. Diese Bits, Nullen und Einsen, werden normalerweise in Gruppen von acht zusammengefasst, um Bytes zu bilden. Wenn Sie ein JPEG-Bild auf Ihrem Computer öffnen, muss etwas (der Browser, das Betriebssystem oder ein anderes Programm) die Bytes dekodieren und das ursprĂŒngliche Bild als eine Liste von Farben wiederherstellen, die angezeigt werden können.
Wenn Sie dieses niedliche herunterladen und in einem Texteditor öffnen, sehen Sie eine Menge zusammenhangloser Zeichen.

Hier benutze ich Notepad++, um den Inhalt der Datei zu untersuchen, da normale Texteditoren wie Notepad in Windows die BinÀrdatei nach dem Speichern beschÀdigen und sie nicht mehr dem JPEG-Format entspricht.
Wenn Sie ein Bild in einem Texteditor öffnen, verwirren Sie den Computer genauso, wie Sie Ihr Gehirn irritieren, wenn Sie sich die Augen reiben und anfangen, farbige Flecken zu sehen!
Diese Flecken, die Sie sehen, sind bekannt als , und sie sind kein Ergebnis eines Lichtreizes oder Halluzinationen, die vom Geist erzeugt werden. Sie entstehen, weil Ihr Gehirn annimmt, dass elektrische Signale in den Sehnerven Informationen ĂŒber Licht ĂŒbertragen. Das Gehirn muss solche Annahmen treffen, da es unmöglich ist zu wissen, ob ein Signal ein GerĂ€usch, eine Vision oder etwas anderes ist. Alle Nerven im Körper ĂŒbertragen absolut identische elektrische Impulse. Wenn Sie auf die Augen drĂŒcken, senden Sie Signale, die keine visuellen sind, aber die Rezeptoren im Auge aktivieren, was Ihr Gehirn - in diesem Fall fĂ€lschlicherweise - als etwas Visuelles interpretiert. Sie sind buchstĂ€blich in der Lage, Druck zu sehen!
Es ist interessant darĂŒber nachzudenken, wie sehr Computer dem menschlichen Gehirn Ă€hneln, aber es ist auch eine nĂŒtzliche Analogie, die veranschaulicht, wie stark die Bedeutung von Daten â ob sie durch den Körper ĂŒber Nerven ĂŒbertragen oder auf einem Computer gespeichert werden â von ihrer Interpretation abhĂ€ngt. Alle binĂ€ren Daten bestehen aus Nullen und Einsen, den grundlegenden Komponenten, die Informationen jeder Art ĂŒbertragen können. Ihr Computer erkennt oft, wie man sie interpretiert, anhand von Hinweisen wie z. B. Dateierweiterungen. Jetzt aber fordern wir ihn auf, sie als Text zu interpretieren, da dies vom Texteditor erwartet wird.
Um zu verstehen, wie JPEG decodiert wird, mĂŒssen wir die ursprĂŒnglichen Signale â die binĂ€ren Daten â sehen. Das kann man mit einem Hex-Editor machen, oder direkt auf ! Dort gibt es ein Bild, neben dem im Textfeld alle seine Bytes (auĂer dem Header) in dezimaler Form angezeigt werden. Sie können diese Ă€ndern, und das Skript wird sie in Echtzeit neu codieren und ein neues Bild ausgeben.

Man kann viel lernen, indem man einfach mit diesem Editor spielt. Könnten Sie zum Beispiel sagen, in welcher Reihenfolge die Pixel gespeichert sind?
Das Seltsame an diesem Beispiel ist, dass die Ănderung einiger Zahlen ĂŒberhaupt keinen Einfluss auf das Bild hat, aber wenn man beispielsweise die Zahl 17 in der ersten Zeile durch 0 ersetzt, wird das Bild völlig ruiniert!

Andere Ănderungen, wie das Ersetzen von 7 in der Zeile 1988 durch die Zahl 254, verĂ€ndern die Farbe, jedoch nur die nachfolgenden Pixel.

Es könnte am seltsamsten sein, dass einige Zahlen nicht nur die Farbe, sondern auch die Form des Bildes Ă€ndern. Ăndern Sie die 70 in Zeile 12 in 2 und schauen Sie sich die obere Reihe des Bildes an, um zu sehen, was ich meine.

Und egal welches JPEG-Bild Sie verwenden, Sie werden immer diese mysteriösen schachbrettartigen Sequenzen beim Bearbeiten der Bytes finden.
Wenn man mit dem Editor spielt, ist es schwer zu verstehen, wie das Bild aus diesen Bytes rekonstruiert wird, da die JPEG-Kompression aus drei verschiedenen Technologien besteht, die nacheinander auf unterschiedlichen Ebenen angewendet werden. Wir werden jede von ihnen einzeln untersuchen, um das von uns beobachtete rĂ€tselhafte Verhalten zu entschlĂŒsseln.
Drei Ebenen der JPEG-Kompression:
- .
- .
- , und
Um Ihnen die Dimensionen der Kompression vorzustellen, beachten Sie, dass das oben gezeigte Bild 79.819 Zahlen umfasst, also etwa 79 kB. WĂŒrden wir es unkomprimiert speichern, wĂ€ren fĂŒr jeden Pixel drei Zahlen erforderlich â fĂŒr die rot, grĂŒn und blau Komponente. Das wĂ€ren 917.700 Zahlen, also ca. 917 kB. Durch die JPEG-Kompression hat sich die endgĂŒltige Datei um mehr als das 10-fache reduziert!
In der Tat kann dieses Bild viel stĂ€rker komprimiert werden. Unten sehen Sie zwei Bilder nebeneinander â das Foto rechts wurde auf 16 kB komprimiert, also 57-mal kleiner als die unkomprimierte Version!

Wenn man genau hinsieht, wird deutlich, dass diese Bilder nicht identisch sind. Beide sind JPEG-komprimierte Bilder, jedoch ist das rechte viel kleiner. AuĂerdem sieht es etwas schlechter aus (schauen Sie sich die farbigen Hintergrundquadrate an). Deshalb wird JPEG auch als verlustbehaftete Kompression bezeichnet; wĂ€hrend des Kompressionsprozesses verĂ€ndert sich das Bild und verliert einige Details.
1. Farbunterabtastung
Hier ist das Bild mit nur der ersten Kompressionsebene.

(Interaktive Version â im Jetzt sind die Zahlen etwas einfacher zu entschlĂŒsseln. Es ist fast eine einfache Farbliste, bei der jedes Byte genau einen Pixel Ă€ndert, aber es ist bereits halb so groĂ wie das unkomprimierte Bild (das etwa 300 kB in dieser reduzierten GröĂe einnehmen wĂŒrde). Wissen Sie, warum?
Man sieht, dass diese Zahlen nicht die Standardwerte fĂŒr rot, grĂŒn und blau reprĂ€sentieren, denn wenn man alle Zahlen durch Nullen ersetzt, erhĂ€lt man ein grĂŒnes Bild (und nicht ein weiĂes).
Das liegt daran, dass diese Bytes Y (Helligkeit) darstellen,

Cb (relative Blauigkeit),

und Cr (relative Rötlichkeit) des Bildes.

Warum nicht RGB verwenden? So funktioniert es doch bei den meisten modernen Bildschirmen. Ihr Monitor kann jede Farbe darstellen, einschlieĂlich rot, grĂŒn und blau in unterschiedlicher IntensitĂ€t fĂŒr jeden Pixel. WeiĂ entsteht, wenn alle drei Farben auf maximale Helligkeit eingestellt sind, wĂ€hrend schwarz ihre Deaktivierung bedeutet.

Das Àhnelt auch der Funktionsweise des menschlichen Auges. Die Farbrezeptoren unserer Augen werden "

Zapfen" genannt.«, und sie werden in drei Typen unterteilt, von denen jeder empfindlicher auf entweder Rot, GrĂŒn oder Blau reagiert [S-Typ-StĂ€bchen sind empfindlich im violett-blauen (S von engl. Short â kurzwelliges Spektrum), M-Typ â im grĂŒn-gelben (M von engl. Medium â mittelwellig), und L-Typ â im gelb-roten (L von engl. Long â langwellig) Spektralbereich. Das Vorhandensein dieser drei Arten von StĂ€bchen (und Zapfen, die empfindlich im smaragdgrĂŒnen Bereich des Spektrums sind) verleiht dem Menschen das Farbsehen. \/ Anmerkung des Ăbersetzers.] , ein anderer Typ von Photorezeptoren in unseren Augen, kann VerĂ€nderungen in der Helligkeit wahrnehmen, ist jedoch viel empfindlicher gegenĂŒber Farbe. In unseren Augen gibt es etwa 120 Millionen StĂ€bchen und nur 6 Millionen Zapfen.
Unsere Augen nehmen daher VerÀnderungen in der Helligkeit viel besser wahr als VerÀnderungen in der Farbe. Wenn man Farbe von Helligkeit trennt, kann man etwas Farbe entfernen, und niemand wird es bemerken. Farbsubdiskretisierung ist der Prozess, bei dem die Farbkomponenten eines Bildes mit einer geringeren Auflösung im Vergleich zu den Helligkeitskomponenten dargestellt werden. Im obigen Beispiel hat jeder Pixel genau eine Y-Komponente, und jede einzelne Gruppe von vier Pixeln hat genau eine Cb- und eine Cr-Komponente. Daher enthÀlt das Bild viermal weniger Farbinformationen als das Original.
Der Farbraum YCbCr wird nicht nur in JPEG verwendet. Er wurde ursprĂŒnglich 1938 fĂŒr Fernsehsendungen entwickelt. Nicht jeder hat einen Farbfernseher, daher ermöglichte die Trennung von Farbe und Helligkeit allen, dasselbe Signal zu empfangen, wobei Farblos-Fernseher nur die Helligkeitskomponente verwendeten.
Das Entfernen einer Zahl im Editor zerstört daher alle Farben vollstĂ€ndig. Die Komponenten werden als Y Y Y Y Cb Cr gespeichert (tatsĂ€chlich nicht zwingend in dieser Reihenfolge â die Speicherreihenfolge wird durch den Header der Datei festgelegt). Das Entfernen der ersten Zahl fĂŒhrt dazu, dass der erste Cb-Wert als Y angesehen wird, Cr als Cb, und insgesamt ergibt sich der Dominoeffekt, der alle Farben des Bildes umschaltet.
Die JPEG-Spezifikation verpflichtet Sie nicht zur Verwendung von YCbCr. In den meisten Dateien wird es jedoch verwendet, da es im Vergleich zu RGB qualitativ bessere Bilder nach der Subsampling liefert. Aber Sie mĂŒssen mir nicht einfach glauben. Schauen Sie sich in der Tabelle unten an, wie das Subsampling jeder einzelnen Komponente sowohl in RGB als auch in YCbCr aussieht.

(Interaktive Version â im Artikel).
Die Entfernung von Blau ist nicht so auffĂ€llig wie die von Rot oder GrĂŒn. Das liegt daran, dass von den sechs Millionen Zapfen in Ihren Augen etwa 64 % empfindlich auf Rot, 32 % auf GrĂŒn und 2 % auf Blau reagieren.
Das Subsampling der Y-Komponente (links unten) ist am besten zu erkennen. Selbst eine kleine VerÀnderung ist bemerkbar.
Die Umwandlung von Bildern von RGB in YCbCr verringert nicht die DateigröĂe, erleichtert jedoch das Auffinden weniger auffĂ€lliger Details, die entfernt werden können. Die verlustbehaftete Kompression erfolgt im zweiten Schritt. Ihre Grundlage bildet die Idee, die Daten in einer komprimierbareren Form darzustellen.
2. Diskretes Kosinus-Transformieren und Subsampling
Dieses Kompressionsniveau bestimmt weitgehend die Essenz von JPEG. Nach der Farbumwandlung in YCbCr werden die Komponenten einzeln komprimiert, sodass wir uns im Folgenden nur auf die Y-Komponente konzentrieren können. So sehen die Bytes der Y-Komponente nach der Anwendung dieses Niveaus aus.

(Interaktive Version â im Artikel). In der interaktiven Version wird ein Klick auf ein Pixel den Editor auf die Zeile scrollen, die es bezeichnet. Versuchen Sie, Zahlen am Ende zu löschen oder einige Nullen zu einer bestimmten Zahl hinzuzufĂŒgen.
Auf den ersten Blick schaut das nach einer sehr schlechten Kompression aus. In einem Bild mit 100.000 Pixeln sind zur Angabe ihrer Helligkeit (Y-Komponente) 102.400 Zahlen erforderlich â das ist schlechter, als wenn gar nichts komprimiert wird!
Beachten Sie jedoch, dass die meisten dieser Zahlen gleich Null sind. DarĂŒber hinaus können all diese Nullen am Zeilenende entfernt werden, ohne das Bild zu Ă€ndern. Es bleiben etwa 26.000 Zahlen, was fast viermal weniger ist!
In diesem Niveau liegt das Geheimnis der Schachmuster. Im Gegensatz zu anderen Effekten, die wir gesehen haben, ist das Auftreten dieser Muster kein Fehler. Sie sind die Bausteine des gesamten Bildes. In jeder Zeile des Editors befinden sich genau 64 Zahlen, die Koeffizienten der diskreten Kosinus-Transformation (DCT), die den IntensitÀten von 64 einzigartigen Mustern entsprechen.
Diese Muster werden auf der Grundlage des Cosinus-Diagramms gebildet. So sehen einige von ihnen aus:

8 von 64 Koeffizienten
Nachfolgend ist ein Bild, das alle 64 Muster zeigt.

(Interaktive Version â im Artikel).
Diese Muster haben eine besondere Bedeutung, da sie die Basis fĂŒr Bilder der GröĂe 8x8 bilden. Wenn Sie mit linearer Algebra nicht vertraut sind, bedeutet dies, dass jedes Bild der GröĂe 8x8 aus diesen 64 Mustern erzeugt werden kann. DCT ist der Prozess, bei dem Bilder in 8x8-Blöcke zerlegt werden und jeder Block in eine Kombination aus diesen 64 Koeffizienten umgewandelt wird.
Die Tatsache, dass jedes Bild aus 64 bestimmten Mustern zusammengesetzt werden kann, wirkt wie Magie. Aber es ist dasselbe, wie zu sagen, dass jeder Ort auf der Erde mit zwei Zahlen beschrieben werden kann â Breite und LĂ€nge [unter Angabe der HemisphĂ€ren / Anm. d. Ăbers.]. Wir betrachten oft die ErdoberflĂ€che als zweidimensional, weshalb wir nur zwei Zahlen benötigen. Ein 8x8-Bild hat 64 Dimensionen, deshalb benötigen wir 64 Zahlen.
Es ist noch unklar, wie uns das im Hinblick auf die Kompression hilft. Wenn wir 64 Zahlen benötigen, um ein 8x8-Bild darzustellen, warum sollte diese Methode besser sein, als einfach 64 Helligkeitskomponenten zu speichern? Wir tun dies aus demselben Grund, aus dem wir drei RGB-Zahlen in drei YCbCr-Zahlen umgewandelt haben: Es ermöglicht uns, unauffÀllige Details zu entfernen.
Es ist schwer zu erkennen, welche Details in diesem Stadium entfernt werden, da JPEG DCT auf 8x8-Blöcke anwendet. Niemand hindert uns jedoch daran, es auf ein ganzes Bild anzuwenden. So sieht DCT auf der Y-Komponente aus, wenn es auf ein ganzes Bild angewendet wird:

Von den letzten kann man ĂŒber 60.000 Zahlen praktisch ohne merkliche Ănderungen am Foto entfernen.

Beachten Sie jedoch, dass, wenn wir die ersten fĂŒnf Zahlen auf Null setzen, der Unterschied offensichtlich sein wird.

Die Zahlen am Anfang reprĂ€sentieren Ănderungen niedriger Frequenz im Bild, und unsere Augen nehmen sie am besten wahr. Die Zahlen nĂ€her am Ende reprĂ€sentieren Ănderungen hoher Frequenz, die schwerer zu bemerken sind. Um "das Unsichtbare zu sehen", können wir diese Hochfrequenzdetails isolieren, indem wir die ersten 5000 Zahlen auf Null setzen.

Wir sehen alle Bereiche des Bildes, in denen die gröĂte VerĂ€nderung von Pixel zu Pixel stattfindet. Die Augen der Katze, ihre Schnurrhaare, die flauschige Decke und die Schatten in der unteren linken Ecke heben sich hervor. Man könnte sogar noch weitergehen und die ersten 10.000 Zahlen auf Null setzen:

20 000:

40 000:

60 000:

Diese hochfrequenten JPEG-Daten werden beim Komprimierungsprozess entfernt. Die Umwandlung der Farben in DCT-Koeffizienten ist verlustfrei. Verluste entstehen bei der Diskretisierung, wo hochfrequente oder nahezu null Werte entfernt werden. Wenn Sie die QualitĂ€t der JPEG-Speicherung verringern, erhöht das Programm die Schwelle der zu entfernenden Werte, was zu einer Verkleinerung der DateigröĂe fĂŒhrt, aber das Bild pixeliger macht. Deshalb sah das Bild im ersten Abschnitt, das 57 Mal kleiner war, so aus. Jeder Block von 8x8 wurde durch eine viel geringere Anzahl von DCT-Koeffizienten im Vergleich zur qualitativ hochwertigen Version reprĂ€sentiert.
Man kann einen coolen Effekt erzielen, wie das schrittweise Streaming von Bildern. Man kann ein verschwommenes Bild anzeigen, das mit zunehmendem Herunterladen immer detaillierter wird.
Hier, nur aus Interesse, was passiert, wenn man nur 24.000 Zahlen verwendet:

Oder nur 5000:

Sehr verschwommen, aber irgendwie erkennbar!
3. Codierung von Laufzeitfolgen, Delta und Huffman
Bisher wurden alle Komprimierungsstufen verlustbehaftet durchgefĂŒhrt. Der letzte Schritt hingegen erfolgt verlustfrei. Er entfernt keine Informationen, reduziert jedoch die DateigröĂe erheblich.
Wie kann man etwas komprimieren, ohne Informationen abzulehnen? Stellen Sie sich vor, wie wir ein einfaches schwarzes Rechteck von 700 x 437 beschreiben wĂŒrden.
JPEG verwendet dafĂŒr 5000 Zahlen, aber man kann ein viel besseres Ergebnis erzielen. Können Sie sich ein Codierungsschema vorstellen, das ein solches Bild mit möglichst wenigen Bytes beschreibt?
Das minimale Schema, das ich mir ausgedacht habe, verwendet vier: drei zur Angabe der Farbe und die vierte, wie viele Pixel diese Farbe hat. Die Idee, sich wiederholende Werte auf diese komprimierte Weise darzustellen, wird als Laufzeitcodierung bezeichnet. Sie ist verlustfrei, da wir die kodierten Daten in ihrer ursprĂŒnglichen Form wiederherstellen können.
Die GröĂe der JPEG-Datei mit dem schwarzen Rechteck betrĂ€gt viel mehr als 4 Byte â denken Sie daran, dass auf DCT-Ebene die Komprimierung auf 8x8 Pixel-Bock angewendet wird. Daher benötigen wir mindestens einen DCT-Koeffizienten fĂŒr jede 64 Pixel. Einen brauchen wir, weil anstelle der Speicherung eines DCT-Koeffizienten, dem 63 Nullen folgen, die Laufzeitkodierung es uns ermöglicht, eine Zahl zu speichern und zu kennzeichnen, dass "alle anderen Nullen sind".
Delta-Kodierung ist eine Technik, bei der jedes Byte die Abweichung von einem bestimmten Wert und nicht den absoluten Wert enthÀlt. Daher Àndert die Bearbeitung bestimmter Bytes die Farbe aller anderen Pixel. Zum Beispiel, anstatt zu speichern
12 13 14 14 14 13 13 14
Wir könnten mit 12 beginnen und dann einfach angeben, wie viel dazu addiert oder abgezogen werden muss, um die nĂ€chste Zahl zu erhalten. Und diese Sequenz der Delta-Kodierung sieht folgendermaĂen aus:
12 1 1 0 0 -1 0 1
Die transformierten Daten werden nicht kleiner als die ursprĂŒnglichen, aber sie sind leichter zu komprimieren. Die Anwendung der Delta-Kodierung vor der Laufzeitkodierung kann erheblich helfen, wĂ€hrend sie verlustfreie Kompression bleibt.
Delta-Kodierung ist eine der wenigen Techniken, die auĂerhalb von 8x8 Blöcken angewendet werden. Von 64 DCT-Koeffizienten ist einer einfach eine konstante Wellenfunktion (einfarbige Farbe). Er reprĂ€sentiert die durchschnittliche Helligkeit jedes Blocks fĂŒr Helligkeitskomponenten oder die durchschnittliche BlĂ€ue fĂŒr Cb-Komponenten und so weiter. Der erste Wert jedes DCT-Blocks wird als DC-Wert bezeichnet, und jeder DC-Wert wird in Bezug auf die vorherigen delta-kodiert. Daher beeinflusst eine HelligkeitsĂ€nderung des ersten Blocks alle Blöcke.
Es bleibt das letzte RĂ€tsel: Wie kann die Ănderung einer einzelnen Zahl das gesamte Bild ruinieren? Bisher gab es solche Eigenschaften der Kompressionsstufen nicht. Die Antwort liegt im JPEG-Header. Die ersten 500 Bytes enthalten Metadaten zum Bild â Breite, Höhe usw., und solange wir nicht mit ihnen gearbeitet haben,
Ohne Header ist es nahezu unmöglich (oder sehr schwierig), JPEG zu dekodieren. Es wĂŒrde so aussehen, als wĂŒrde ich versuchen, Ihnen ein Bild zu beschreiben, und beginne, Worte zu erfinden, um meinen Eindruck zu vermitteln. Die Beschreibung wird wahrscheinlich sehr komprimiert sein, da ich Worte genau mit der Bedeutung erfinden kann, die ich vermitteln möchte, aber fĂŒr alle anderen werden sie keinen Sinn ergeben.
Es klingt dumm, aber genau so lĂ€uft es. Jedes JPEG-Bild wird mit spezifischen Codes komprimiert, die nur fĂŒr dieses Bild gelten. Das Code-Wörterbuch wird im Header gespeichert. Diese Technik wird als âHuffman-Codeâ bezeichnet, und das Wörterbuch ist die Huffman-Tabelle. Im Header ist die Tabelle mit zwei Bytes markiert â 255 und dann 196. Jeder Farbkomponente kann ihre eigene Tabelle zugeordnet werden.
Ănderungen an den Tabellen beeinflussen jedes Bild radikal. Ein gutes Beispiel ist, die 1 in der 15. Zeile gegen 12 auszutauschen.

Das passiert, weil in den Tabellen angegeben ist, wie man einzelne Bits lesen muss. Bisher haben wir nur mit binĂ€ren Zahlen in dezimaler Form gearbeitet. Aber das verdeckt uns die Tatsache, dass, wenn Sie die Zahl 1 in einem Byte speichern möchten, es so aussehen wird: 00000001, weil in jedem Byte genau acht Bits sein mĂŒssen, auch wenn nur eines von ihnen benötigt wird.
Das ist potenziell ein groĂer Platzbedarf, wenn Sie viele kleine Zahlen haben. Der Huffman-Code ist eine Technik, die es uns ermöglicht, diese Anforderung, dass jede Zahl acht Bits einnehmen muss, zu lockern. Das bedeutet, dass, wenn Sie zwei Bytes sehen:
234 115
In AbhĂ€ngigkeit von der Huffman-Tabelle könnten dies drei Zahlen sein. Um sie zu extrahieren, mĂŒssen Sie sie zuerst in einzelne Bits aufteilen:
11101010 01110011
Dann schauen wir in die Tabelle, um zu verstehen, wie sie gruppiert werden. Zum Beispiel könnten das die ersten sechs Bits (111010) sein oder 58 im Dezimalsystem, gefolgt von fĂŒnf Bits (10011) oder 19 und schlieĂlich die letzten vier Bits (0011) oder 3.
Deshalb ist es sehr schwierig, in dieser Phase der Kompression die Bytes zu entschlĂŒsseln. Die Bytes reprĂ€sentieren nicht das, was sie zu sein scheinen. Ich werde hier nicht in die Details der Arbeit mit der Tabelle eintauchen, aber zu diesem Thema sind online .
Einer der interessanten Tricks, die Sie wissen können, ist, den Header von JPEG zu trennen und ihn separat zu speichern. Im Grunde genommen können nur Sie die Datei lesen. Facebook macht das, um die Dateien noch weiter zu reduzieren.
Was Sie ebenfalls machen können, ist, die Huffman-Tabelle ein wenig zu verĂ€ndern. FĂŒr andere wird es wie ein beschĂ€digtes Bild aussehen. Nur Sie werden die magische Methode zur Behebung wissen.
Fassen wir zusammen: Was wird benötigt, um JPEG zu dekodieren? Es sind erforderlich:
- Die Huffman-Tabelle(n) aus dem Header zu extrahieren und die Bits zu dekodieren.
- Extrahiere die Koeffizienten der diskreten Cosinus-Transformation fĂŒr jede Farb- und Helligkeitskomponente fĂŒr jedes 8x8-Block, indem die inversen Transformationen der Laufzeitkodierung und der Deltas durchgefĂŒhrt werden.
- Kombiniere die Cosinuswerte basierend auf den Koeffizienten, um die Pixelwerte fĂŒr jedes 8x8-Block zu erhalten.
- Skaliere die Farbkomponenten, falls eine Subdiskretisierung durchgefĂŒhrt wurde (diese Information befindet sich im Header).
- Konvertiere die erhaltenen YCbCr-Werte fĂŒr jedes Pixel in RGB.
- Gib das Bild auf dem Bildschirm aus!
Eine ernsthafte Aufgabe fĂŒr das einfache Anschauen eines Katzenfotos! Aber was mir daran gefĂ€llt â man sieht, wie nutzerzentriert die JPEG-Technologie ist. Sie basiert auf den Besonderheiten unserer Wahrnehmung, die es ermöglichen, eine viel bessere Kompression zu erreichen als mit herkömmlichen Technologien. Und jetzt, da ich verstehe, wie JPEG funktioniert, kann ich mir vorstellen, wie diese Technologien in andere Bereiche ĂŒbertragen werden können. Zum Beispiel kann die Deltacodierung in Videos erheblich die DateigröĂe reduzieren, da es dort oft groĂe Bereiche gibt, die sich von Frame zu Frame nicht Ă€ndern (zum Beispiel der Hintergrund).
, ist offen und enthÀlt Anweisungen zum Ersetzen von Bildern durch eigene.
Quelle: habr.com
