JPEG-Bilder sind in unserem digitalen Leben allgegenwĂ€rtig, doch hinter dieser Allgemeinheit verbergen sich Algorithmen, die Details eliminieren, die das menschliche Auge nicht wahrnimmt. Das Ergebnis ist eine herausragende visuelle QualitĂ€t bei minimaler DateigröĂe â aber wie funktioniert das genau? Lassen Sie uns entdecken, was unser Blick nicht erfassen kann!

Es ist leicht, die Möglichkeit, ein Foto an einen Freund zu senden, fĂŒr selbstverstĂ€ndlich zu halten, ohne sich Gedanken darĂŒber zu machen, welches GerĂ€t, welcher Browser oder welches Betriebssystem er nutzt â doch das war nicht immer so. In den frĂŒhen 1980er Jahren konnten Computer digitale Bilder speichern und anzeigen, jedoch gab es viele konkurrierende Ideen, wie dies am besten zu bewerkstelligen sei. Man konnte nicht einfach ein Bild von einem Computer zu einem anderen senden und hoffen, dass alles funktioniert.
Um dieses Problem zu lösen, wurde 1986 ein Komitee von Experten aus der ganzen Welt zusammengestellt, das den Namen â» (Joint Photographic Experts Group, JPEG), gegrĂŒndet im Rahmen der Zusammenarbeit zwischen der Internationalen Organisation fĂŒr Normung (ISO) und der Internationalen Elektrotechnischen Kommission (IEC) â zwei internationalen Normungsorganisationen mit Sitz in Genf (Schweiz).
Die Gruppe von Menschen, die als JPEG bekannt ist, entwickelte 1992 den JPEG-Standard zur Kompression digitaler Bilder. Jeder, der das Internet genutzt hat, ist wahrscheinlich auf Bilder im JPEG-Format gestoĂen. Dies ist die am weitesten verbreitete Methode zum Kodieren, Ăbertragen und Speichern von Bildern. Von Webseiten ĂŒber E-Mails bis hin zu sozialen Medien wird JPEG tĂ€glich milliardenfach verwendet â praktisch jedes Mal, wenn wir ein Bild online betrachten oder versenden. Ohne JPEG wĂ€re das Web weniger lebendig, langsamer und wahrscheinlich wĂŒrde es weniger Katzenbilder geben!
Dieser Artikel handelt davon, wie man ein JPEG-Bild decodiert. Anders ausgedrĂŒckt, es geht darum, was nötig ist, um die komprimierten Daten, die auf dem Computer gespeichert sind, in ein Bild zu verwandeln, das auf dem Bildschirm erscheint. Das ist wichtig zu wissen, nicht nur um die Technologie zu verstehen, die wir tĂ€glich nutzen, sondern auch weil das VerstĂ€ndnis der Komprimierungsebenen unser Wissen ĂŒber das Sehen und unsere Wahrnehmung erweitert und uns zeigt, auf welche Details unsere Augen besonders empfindlich reagieren.
AuĂerdem macht es groĂen SpaĂ, auf diese Weise mit Bildern zu experimentieren.

Ein Blick ins Innere von JPEG
Auf einem Computer werden alle Daten als eine Sequenz von BinĂ€rzahlen gespeichert. Diese Bits, bestehend aus Nullen und Einsen, werden normalerweise in Gruppen von acht zusammengefasst und bilden Bytes. Wenn Sie ein JPEG-Bild auf Ihrem Computer öffnen, muss etwas (wie ein Browser oder das Betriebssystem) diese Bytes decodieren und das ursprĂŒngliche Bild als Liste von Farben wiederherstellen, die angezeigt werden können.
Wenn Sie dieses niedliche herunterladen und in einem Texteditor öffnen, werden Sie eine Menge unzusammenhÀngender Zeichen sehen.

Hier verwende ich Notepad++ zur Analyse des Dateiinhalt, da herkömmliche Texteditoren wie Notepad von Windows die BinÀrdatei nach dem Speichern beschÀdigen und sie nicht mehr dem JPEG-Format entsprechen kann.
Wenn Sie ein Bild in einem Texteditor öffnen, verwirren Sie den Computer, genau wie Sie Ihr Gehirn verwirren, wenn Sie sich die Augen reiben und anfangen, bunte Flecken zu sehen!
Diese Flecken, die Sie sehen, sind bekannt als , und sind kein Resultat einer Lichtexposition oder Halluzinationen, die vom Geist erzeugt werden. Sie entstehen, weil Ihr Gehirn annimmt, dass alle elektrischen Signale in den Sehnerven Informationen ĂŒber Licht vermitteln. Das Gehirn muss solche Annahmen treffen, da es unmöglich ist herauszufinden, 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 nicht visuell sind, aber die Rezeptoren im Auge aktivieren, was Ihr Gehirn â in diesem Fall fĂ€lschlicherweise â als visuelles Erlebnis interpretiert. Sie können buchstĂ€blich Druck sehen!
Es ist interessant zu bedenken, wie sehr Computer dem menschlichen Gehirn Ă€hneln; gleichzeitig ist dies eine nĂŒtzliche Analogie, die veranschaulicht, wie stark die Bedeutung von Daten â sei es ĂŒber Nerven im Körper oder gespeichert auf einem Computer â von ihrer Interpretation abhĂ€ngt. Alle binĂ€ren Daten bestehen aus Nullen und Einsen, den grundlegenden Komponenten, die Informationen jeglicher Art ĂŒbertragen können. Ihr Computer versucht oft zu erraten, wie diese Daten interpretiert werden sollten, mittels Hinweisen wie Dateierweiterungen. Jetzt zwingen wir ihn, sie als Text zu interpretieren, da genau dies ein Texteditor erwartet.
Um zu verstehen, wie man JPEG decodiert, mĂŒssen wir die ursprĂŒnglichen Signale â die binĂ€ren Daten â sehen. Dies kann ĂŒber einen Hex-Editor geschehen oder direkt auf der ! Dort gibt es ein Bild, neben dem in einem Textfeld alle seine Bytes (ohne Header) in dezimaler Form angezeigt werden. Sie können diese Ă€ndern, und das Skript wird sie neu kodieren und ein neues Bild in Echtzeit erzeugen.

Man kann viel lernen, indem man mit diesem Editor spielt. Zum Beispiel, wissen Sie, in welcher Reihenfolge die Pixel gespeichert sind?
Was an diesem Beispiel seltsam ist, ist, dass die Ănderung einiger Zahlen ĂŒberhaupt keinen Einfluss auf das Bild hat. Wenn Sie jedoch die Zahl 17 in der ersten Zeile durch 0 ersetzen, wird das Bild völlig ruiniert!

Andere Ănderungen, wie das Ersetzen von 7 in Zeile 1988 durch die Zahl 254, verĂ€ndern die Farbe, aber nur fĂŒr die folgenden Pixel.

Am seltsamsten ist vielleicht, dass einige Zahlen nicht nur die Farbe, sondern auch die Form des Bildes verĂ€ndern. Ăndern Sie die 70 in Zeile 12 auf 2 und schauen Sie sich die oberste Reihe des Bildes an, um zu sehen, was ich meine.

Egal welches JPEG-Bild Sie verwenden, Sie werden immer diese mysteriösen Schachmuster finden, wenn Sie Bytes bearbeiten.
Es ist schwer zu verstehen, wie das Bild aus diesen Bytes rekonstruiert wird, wÀhrend man mit dem Editor spielt, da die JPEG-Kompression aus drei verschiedenen Technologien besteht, die aufeinanderfolgend in Ebenen angewendet werden. Wir werden jede von ihnen getrennt untersuchen, um das geheimnisvolle Verhalten zu erklÀren, das wir beobachten.
Drei Ebenen der JPEG-Kompression:
- .
- .
- , und
Um Ihnen eine Vorstellung vom Umfang der Kompression zu geben: Das oben gezeigte Bild hat 79.819 Zahlen, also etwa 79 KB. Wenn wir es unkomprimiert speichern wĂŒrden, brĂ€uchten wir fĂŒr jeden Pixel drei Zahlen â fĂŒr die roten, grĂŒnen und blauen Komponenten. Das wĂŒrde 917.700 Zahlen oder etwa 917 KB ergeben. Durch die JPEG-Kompression wurde die endgĂŒltige Datei um mehr als das Zehnfache reduziert!
TatsĂ€chlich könnte dieses Bild noch viel stĂ€rker komprimiert werden. Unten sind zwei Bilder nebeneinander â das Foto rechts wurde auf 16 KB komprimiert, also 57 Mal kleiner als die unkomprimierte Version!

Wenn Sie genau hinsehen, werden Sie feststellen, dass diese Bilder nicht identisch sind. Beide sind Bilder mit JPEG-Kompression, aber das rechte ist wesentlich kleiner. Es sieht auch etwas schlechter aus (sehen Sie sich die Farbquadrate des Hintergrunds an). Daher wird JPEG auch als verlustbehaftete Kompression bezeichnet; wÀhrend des Kompressionsprozesses Àndert sich das Bild und verliert einige Details.
1. Farbsubsampling
Hier ist ein Bild, das nur die erste Stufe der Kompression verwendet.

(Interaktive Version â in Artikel). Das Entfernen einer Zahl ruiniert alle Farben. Das Entfernen von genau sechs Zahlen hat jedoch praktisch keinen Einfluss auf das Bild.
Jetzt sind die Zahlen etwas einfacher zu entschlĂŒsseln. Es handelt sich fast um eine einfache Liste von Farben, bei der jedes Byte genau einen Pixel Ă€ndert, und sie ist bereits doppelt so klein wie das unkomprimierte Bild (das in dieser reduzierten GröĂe etwa 300 KB belegen wĂŒrde). Wissen Sie, warum?
Man kann sehen, dass diese Zahlen keine standardmĂ€Ăigen roten, grĂŒnen und blauen Komponenten darstellen, denn wenn man alle Zahlen durch Nullen ersetzt, erhalten wir ein grĂŒnes Bild (statt eines weiĂen).

Das liegt daran, dass diese Bytes Y (Helligkeit) darstellen,

Cb (relative BlÀue),

und Cr (relative Röte) des Bildes.

Warum nicht RGB verwenden? Immerhin funktionieren die meisten modernen Bildschirme genau so. Ihr Monitor kann jede Farbe anzeigen, einschlieĂlich rot, grĂŒn und blau in unterschiedlicher IntensitĂ€t fĂŒr jeden Pixel. WeiĂ entsteht, wenn alle drei bei voller Helligkeit eingeschaltet sind, und schwarz, wenn sie ausgeschaltet sind.

Das Ă€hnelt auch stark der Funktionsweise des menschlichen Auges. Die Farbrezeptoren in unseren Augen heiĂen ââ und lassen sich in drei Typen unterteilen, von denen jeder empfindlicher auf entweder Rot, GrĂŒn oder Blau reagiert. [S-Zapfen sind empfindlich im violett-blauen Bereich (S von engl. Short â kurzwelliges Spektrum), M-Zapfen im grĂŒn-gelben (M von engl. Medium â mittellanges WellenlĂ€ngen), und L-Zapfen im gelb-roten (L von engl. Long â langwelliges) Spektralbereich. Das Vorhandensein dieser drei Arten von Zapfen (und StĂ€bchen, die empfindlich im smaragdgrĂŒnen Spektrum sind) ermöglicht es dem Menschen, Farben zu sehen. / Anm. d. Ăbers.] , ein anderer Typ von Fotorezeptoren in unseren Augen, kann VerĂ€nderungen in der Helligkeit erfassen, ist jedoch viel empfindlicher gegenĂŒber Farben. In unseren Augen gibt es etwa 120 Millionen StĂ€bchen und nur 6 Millionen Zapfen.
Deshalb nehmen unsere Augen HelligkeitsÀnderungen viel besser wahr als FarbÀnderungen. Wenn man Farbe von Helligkeit trennt, kann man etwas Farbe reduzieren, ohne dass es jemand bemerkt. Farbunterabtastung ist der Prozess, bei dem die Farbinformationen eines Bildes mit niedrigerer Auflösung im Vergleich zu den Helligkeitskomponenten dargestellt werden. Im obigen Beispiel hat jeder Pixel genau eine Y-Komponente, wÀhrend jede Gruppe von vier Pixeln genau eine Cb- und eine Cr-Komponente hat. 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. Da nicht jeder einen Farbfernseher hat, ermöglichte die Trennung von Farbe und Helligkeit allen, das gleiche Signal zu empfangen, wĂ€hrend farblose Fernseher nur die Helligkeitskomponente verwendeten.
Das Entfernen einer Zahl aus dem Editor hat massive Auswirkungen auf alle Farben. Die Komponenten werden in der Form Y Y Y Y Cb Cr gespeichert (tatsĂ€chlich ist die Reihenfolge nicht zwingend vorgeschrieben â die Speicherreihenfolge wird im Header der Datei festgelegt). Wenn die erste Zahl entfernt wird, wird der erste Cb-Wert als Y interpretiert, Cr als Cb und es entsteht insgesamt ein Domino-Effekt, der alle Farben des Bildes umschaltet.
Die JPEG-Spezifikation zwingt Sie nicht, YCbCr zu verwenden. In den meisten Dateien wird es jedoch eingesetzt, da es bessere BildqualitÀten nach der Subsampling im Vergleich zu RGB liefert. Aber glauben Sie mir nicht einfach so. Schauen Sie sich selbst in der Tabelle unten an, wie das Subsampling jeder einzelnen Komponente sowohl in RGB als auch in YCbCr aussieht.

(Interaktive Version â in Artikel).
Das Entfernen von Blau ist weniger auffĂ€llig als das von Rot oder GrĂŒn. Das liegt daran, dass von 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 deutlichsten sichtbar. Selbst eine kleine VerÀnderung ist bemerkbar.
Die Umwandlung von RGB in YCbCr verringert nicht die DateigröĂe, erleichtert jedoch die Suche nach weniger auffĂ€lligen Details, die entfernt werden können. Die verlustbehaftete Kompression erfolgt im zweiten Schritt. Sie basiert auf der Idee, die Daten in einer kompakteren Form darzustellen.
2. Diskrete Cosinus-Transformation und Diskretisierung
Dieser Kompressionsgrad definiert gröĂtenteils das Wesen von JPEG. Nach der Farbwandlung in YCbCr werden die Komponenten einzeln komprimiert, sodass wir uns spĂ€ter nur auf die Y-Komponente konzentrieren können. So sehen die Bytes der Y-Komponente nach Anwendung dieser Ebene aus.

(Interaktive Version â in Artikel). In der interaktiven Version fĂŒhrt ein Klick auf ein Pixel dazu, dass der Editor auf die Zeile scrollt, die es darstellt. Versuchen Sie, Zahlen am Ende zu entfernen oder einigen Zahlen Nullen hinzuzufĂŒgen.
Auf den ersten Blick sieht es nach einer sehr schlechten Kompression aus. Bei einem Bild mit 100.000 Pixeln sind fĂŒr die Angabe der Helligkeit (Y-Komponente) 102.400 Zahlen erforderlich - das ist schlechter, als wenn man ĂŒberhaupt nicht komprimiert!
Bitte beachten Sie, dass die meisten dieser Zahlen gleich null sind. DarĂŒber hinaus können all diese Nullen am Ende der Zeilen entfernt werden, ohne das Bild zu verĂ€ndern. Es bleiben etwa 26.000 Zahlen, was bereits fast viermal weniger ist!
Auf diesem Niveau liegt das Geheimnis der Schachmuster. Im Gegensatz zu anderen Effekten, die wir gesehen haben, ist das Auftreten dieser Muster kein Glitch. Sie sind die Bausteine des gesamten Bildes. Jede Zeile im Editor enthÀlt genau 64 Zahlen, die Koeffizienten der diskreten Kosinustransformation (DCT), die den IntensitÀten von 64 einzigartigen Mustern entsprechen.
Diese Muster entstehen auf der Grundlage der Kosinuskurve. So sehen einige von ihnen aus:

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

(Interaktive Version â in Artikel).
Diese Muster sind besonders wichtig, da sie die Basis fĂŒr Bilder der GröĂe 8x8 bilden. Wenn Sie mit linearer Algebra nicht vertraut sind, bedeutet das, dass jedes Bild der GröĂe 8x8 aus diesen 64 Mustern erzeugt werden kann. DCT ist der Prozess, der Bilder in Blöcke von 8x8 unterteilt und jeden Block in eine Kombination dieser 64 Koeffizienten umwandelt.
Es scheint fast wie Magie, dass jedes Bild aus 64 bestimmten Mustern bestehen kann. Doch das ist dasselbe, wie zu sagen, dass jeder Punkt auf der Erde mit zwei Zahlen beschrieben werden kann â Breite und LĂ€nge [mit Angabe der HemisphĂ€ren / Anmerkung des Ăbersetzers]. Wir betrachten oft die ErdoberflĂ€che als zweidimensional, weshalb wir nur zwei Zahlen benötigen. Ein 8x8-Bild hat 64 Dimensionen, also 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, warum wir drei RGB-Zahlen in drei YCbCr-Zahlen umgewandelt haben: Es ermöglicht uns, unwesentliche Details zu entfernen.
Es ist schwierig zu erkennen, welche Details in diesem Schritt entfernt werden, da JPEG DCT auf 8x8-Blöcke anwendet. Niemand hindert uns jedoch daran, es auf das gesamte Bild anzuwenden. So sieht DCT auf der Y-Komponente bei der Anwendung auf ein ganzes Bild aus:

Von den letzten Zahlen können ĂŒber 60.000 Zahlen nahezu ohne sichtbare Ănderungen am Foto entfernt werden.

Beachten Sie jedoch, dass die Unterschiede offensichtlich werden, wenn wir die ersten fĂŒnf Zahlen auf null setzen.

Die Zahlen am Anfang zeigen Ănderungen im niedrigen Frequenzbereich des Bildes an, und unsere Augen nehmen sie am besten wahr. Die Zahlen nĂ€her am Ende kennzeichnen Ănderungen im Hochfrequenzbereich, die schwerer zu erkennen sind. Um das "Unsichtbare sichtbar zu machen", können wir diese Hochfrequenzdetails isolieren, indem wir die ersten 5000 Zahlen zurĂŒcksetzen.

Wir sehen alle Bereiche des Bildes, in denen die gröĂten Ănderungen von Pixel zu Pixel stattfinden. Die Augen der Katze, ihre Schnurrhaare, die flauschige Decke und die Schatten in der unteren linken Ecke stechen hervor. Man kann noch weiter gehen und die ersten 10.000 Zahlen zurĂŒcksetzen:

20 000:

40 000:

60 000:

Diese hochfrequenten JPEG-Daten werden in der Kompression entfernt. Die Farbumwandlung in DCT-Koeffizienten erfolgt verlustfrei. Verluste treten beim Diskretisieren auf, wo hochfrequente oder nahezu null Werte entfernt werden. Wenn Sie die JPEG-QualitĂ€t herabsetzen, erhöht das Programm die Schwelle fĂŒr die Anzahl der entfernten Werte, was zu einer Verringerung der DateigröĂe fĂŒhrt, aber das Bild pixeliger erscheinen lĂ€sst. Daher sah das Bild im ersten Abschnitt, das 57 Mal kleiner war, so aus. Jeder 8x8-Block wurde mit deutlich weniger DCT-Koeffizienten dargestellt als bei einer höheren QualitĂ€t.
Man kann einen coolen Effekt erzielen, indem man das Bild schrittweise streamt. Man kann ein unscharfes Bild anzeigen, das immer detaillierter wird, wÀhrend mehr DCT-Koeffizienten heruntergeladen werden.
Hier, nur aus Interesse, was passiert, wenn man nur 24.000 Zahlen verwendet:

Oder nur 5.000:

Sehr verschwommen, aber irgendwie erkennbar!
3. Laufzeitkodierung, Delta und Huffman
Bisher erfolgten alle Kompressionsschritte verlustbehaftet. Der letzte Schritt hingegen erfolgt verlustfrei. Er entfernt keine Informationen, reduziert jedoch erheblich die DateigröĂe.
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 es ist möglich, ein viel besseres Ergebnis zu erzielen. Können Sie sich ein Codierungsschema vorstellen, das ein solches Bild mit möglichst wenigen Bytes beschreibt?
Das minimalste Schema, das ich mir ausdenken konnte, nutzt vier: drei zur Bezeichnung der Farbe und die vierte, um anzugeben, wie viele Pixel diese Farbe haben. Die Idee, wiederkehrende Werte auf so komprimierte Weise darzustellen, nennt man SerienlĂ€ngen-Codierung. Sie ist verlustfrei, da wir die kodierten Daten in ihrer ursprĂŒnglichen Form wiederherstellen können.
Die JPEG-Datei mit dem schwarzen Rechteck ist deutlich gröĂer als 4 Byte â denken Sie daran, dass auf der DCT-Ebene die Komprimierung auf 8x8-Pixel-Blöcke angewendet wird. Daher benötigen wir mindestens einen DCT-Koeffizienten fĂŒr jeweils 64 Pixel. Wir brauchen einen Koeffizienten, weil anstelle der Speicherung eines DCT-Koeffizienten gefolgt von 63 Nullen die Laufzeitcodierung es uns ermöglicht, eine Zahl zu speichern und anzugeben, dass "alle anderen Nullen sind".
Die Delta-Codierung ist eine Technik, bei der jedes Byte die Abweichung von einem bestimmten Wert enthÀlt, anstatt den absoluten Wert. Daher verÀ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 bei 12 anfangen und dann einfach angeben, wie viel wir hinzufĂŒgen oder subtrahieren mĂŒssen, um die nĂ€chste Zahl zu erhalten. Die Sequenz in der Delta-Codierung sieht dann so aus:
12 1 1 0 0 -1 0 1
Die transformierten Daten sind nicht kleiner als die Originaldaten, aber sie sind leichter zu komprimieren. Die Anwendung der Delta-Codierung vor der Laufzeitcodierung kann erheblich helfen und bleibt dabei verlustfrei.
Delta-Codierung ist eine der wenigen Techniken, die auĂerhalb der 8x8-Blöcke angewendet wird. Von 64 DCT-Koeffizienten ist einer einfach eine konstante Wellenfunktion (eine einheitliche Farbe). Er reprĂ€sentiert die durchschnittliche Helligkeit jedes Blocks fĂŒr die Helligkeitsebene oder die durchschnittliche Blauheit fĂŒr die Cb-Komponenten usw. Der erste Wert jedes DCT-Blocks wird als DC-Wert bezeichnet, und jeder DC-Wert wird im VerhĂ€ltnis zu den vorherigen delta-codiert. Daher beeinflusst eine Ănderung der Helligkeit des ersten Blocks alle Blöcke.
Es bleibt das letzte RĂ€tsel: Wie kann die Ănderung einer einzigen Zahl das gesamte Bild ruinieren? Bisher hatten Komprimierungsstufen solche Eigenschaften nicht. Die Antwort liegt im JPEG-Header. Die ersten 500 Bytes enthalten Metadaten ĂŒber das Bild â Breite, Höhe usw., und wir haben bisher nicht mit ihnen gearbeitet.
Ohne den Header ist es nahezu unmöglich (oder sehr schwierig), JPEG zu dekodieren. Es wĂ€re, als wĂŒrde ich versuchen, Ihnen ein Bild zu beschreiben, und ich mĂŒsste Wörter erfinden, um Ihnen meinen Eindruck zu vermitteln. Die Beschreibung wird vermutlich sehr kurz sein, denn ich kann die Begriffe genau so erstellen, wie ich sie ausdrĂŒcken möchte; fĂŒr alle anderen wird das jedoch nicht sinnvoll sein.
Es klingt blöd, aber so ist es nun mal. Jedes JPEG-Bild wird mit codes komprimiert, die spezifisch fĂŒr dieses Bild sind. Das Wörterbuch der Codes wird im Header gespeichert. Diese Technik nennt man 'Huffman-Codierung', und das Wörterbuch ist die Huffman-Tabelle. Im Header ist die Tabelle durch zwei Bytes gekennzeichnet â 255 und dann 196. Jeder Farbkomponente kann ihre eigene Tabelle haben.
Ănderungen an den Tabellen werden radikale Auswirkungen auf jedes Bild haben. Ein gutes Beispiel wĂ€re, die 1 in der 15. Zeile durch eine 12 zu ersetzen.

Dies liegt daran, dass in den Tabellen angegeben wird, wie die einzelnen Bits gelesen werden sollen. Bisher haben wir nur mit binÀren Zahlen in dezimaler Darstellung gearbeitet. Das verbirgt jedoch die Tatsache, dass, wenn Sie die Zahl 1 in einem Byte speichern möchten, sie als 00000001 aussieht, da jedes Byte genau acht Bits haben muss, auch wenn nur eines davon erforderlich ist.
Dies kann potenziell viel Platz verschwenden, wenn Sie viele kleine Zahlen haben. Der Huffman-Code ist eine Technik, die es uns ermöglicht, dieses Erfordernis zu lockern, dass jede Zahl acht Bits einnehmen muss. Das bedeutet, wenn Sie zwei Bytes sehen:
234 115
könnten dies, je nach Huffman-Tabelle, drei Zahlen sein. Um sie zu extrahieren, mĂŒssen Sie sie zuerst in einzelne Bits aufteilen:
11101010 01110011
Dann wenden wir uns der Tabelle zu, um zu verstehen, wie sie gruppiert werden sollen. Zum Beispiel können das die ersten sechs Bits sein (111010), die 58 im Dezimalsystem entsprechen, gefolgt von fĂŒnf Bits (10011), also 19, und schlieĂlich den letzten vier Bits (0011), die 3 darstellen.
Deshalb ist es auf diesem Kompressionsniveau sehr schwierig, mit Bytes umzugehen. Bytes spiegeln nicht das wider, was sie zu sein scheinen. Ich werde nicht nÀher auf die Details der Arbeit mit der Tabelle in diesem Artikel eingehen, aber zu diesem Thema im Internet .
Eine interessante Möglichkeit, die man sich zunutze machen kann, wenn man dies weiĂ, ist, den Header von JPEG zu trennen und ihn separat zu speichern. Im Grunde genommen bedeutet das, dass nur Sie die Datei lesen können. Facebook macht dies ebenfalls, um die Dateien noch weiter zu komprimieren.
Was man auĂerdem tun kann â die Huffman-Tabelle etwas abĂ€ndern. FĂŒr andere wird es wie ein beschĂ€digtes Bild aussehen. Nur Sie werden wissen, wie es magisch repariert werden kann.
Fassen wir zusammen: Was benötigt man zur Dekodierung von JPEG? Man muss:
- Die Huffman-Tabelle(n) aus dem Header extrahieren und die Bits dekodieren.
- Die Koeffizienten der diskreten Kosinustransformation fĂŒr jede Farb- und Helligkeitskomponente jedes 8x8 Blocks extrahieren, indem man RĂŒcktransformationen von Laufzeitkodierung und Deltas durchfĂŒhrt.
- Die Kosinusse basierend auf den Koeffizienten kombinieren, um die Pixelwerte fĂŒr jeden 8x8 Block zu erhalten.
- Skalieren Sie die Farbbestandteile, wenn eine Subliminalisierung vorgenommen wurde (diese Information finden Sie im Titel).
- Konvertieren Sie die erhaltenen YCbCr-Werte fĂŒr jedes Pixel in RGB.
- Zeigen Sie das Bild auf dem Bildschirm an!
Eine anspruchsvolle Aufgabe fĂŒr das einfache Betrachten eines Katzenfotos! Was mir daran jedoch gefĂ€llt â es ist ersichtlich, wie technologieorientiert JPEG ist. Sie basiert auf den Besonderheiten unserer Wahrnehmung, die eine deutlich bessere Kompression ermöglichen als herkömmliche Technologien. Und jetzt, da ich verstehe, wie JPEG funktioniert, kann ich mir vorstellen, wie man diese Technologien auf andere Bereiche ĂŒbertragen kann. Beispielsweise könnte die Delta-Codierung in Videos eine erhebliche Reduzierung der DateigröĂe mit sich bringen, da es oft ganze Bereiche gibt, die sich von Bild zu Bild nicht Ă€ndern (zum Beispiel den Hintergrund).
, ist offen und enthÀlt Anweisungen zum Ersetzen der Bilder durch Ihre eigenen.
Quelle: habr.com
