Obrazy w formacie JPEG można spotkać wszędzie w naszym cyfrowym życiu, ale za tą osłoną świadomości kryją się algorytmy eliminujące szczegóły, które nie są dostrzegane przez ludzkie oko. W rezultacie uzyskujemy najwyższą jakość wizualną przy minimalnym rozmiarze pliku – ale jak dokładnie to wszystko działa? Przyjrzyjmy się, czego nasze oczy nie widzą!

Łatwo jest przyjąć za pewnik możliwość wysłania zdjęcia przyjacielowi i nie martwić się o to, jakie urządzenie, przeglądarkę lub system operacyjny on używa – jednak tak nie było zawsze. Na początku lat 80. komputery potrafiły przechowywać i wyświetlać cyfrowe obrazy, ale istniało wiele konkurencyjnych pomysłów na to, jak to najlepiej zrobić. Nie można było po prostu wysłać obrazu z jednego komputera na drugi i mieć nadzieję, że wszystko zadziała.
Aby rozwiązać ten problem, w 1986 roku powołano międzynarodowy komitet ekspertów pod nazwą „” (Joint Photographic Experts Group, JPEG), utworzony w ramach współpracy Międzynarodowej Organizacji Normalizacyjnej (ISO) i Międzynarodowej Komisji Elektrotechnicznej (IEC) – dwóch międzynarodowych organizacji normalizacyjnych, których siedziba znajduje się w Genewie (Szwajcaria).
Grupa ludzi znana jako JPEG stworzyła standard kompresji cyfrowych obrazów JPEG w 1992 roku. Każdy, kto korzystał z internetu, prawdopodobnie zetknął się z obrazami w kodowaniu JPEG. To najpowszechniejszy sposób kodowania, wysyłania i przechowywania obrazów. Od stron internetowych, przez e-maile, po media społecznościowe, JPEG jest używany miliardy razy dziennie – prawie za każdym razem, gdy oglądamy obraz online lub go wysyłamy. Bez JPEG internet byłby mniej kolorowy, wolniejszy i prawdopodobnie mielibyśmy w nim mniej zdjęć kotów!
Ten artykuł dotyczy tego, jak dekodować obraz JPEG. Mówiąc inaczej, omawia to, co jest potrzebne, aby przekształcić skompresowane dane przechowywane na komputerze w obraz, który pojawia się na ekranie. Warto o tym wiedzieć nie tylko dlatego, że jest to ważne dla zrozumienia technologii, której używamy na co dzień, ale także dlatego, że odkrywając poziomy kompresji, lepiej poznajemy percepcję i wzrok oraz detale, na które nasze oczy są najbardziej wrażliwe.
Poza tym, zabawa z obrazami w ten sposób jest bardzo interesująca.

Zaglądając w głąb JPEG
Na komputerze wszystko jest przechowywane jako sekwencja zer i jedynek. Zwykle te bity, zbiory zer i jedynek, są grupowane po osiem, tworząc bajty. Kiedy otwierasz obraz JPEG na komputerze, coś (przeglądarka, system operacyjny, coś innego) musi dekodować bajty, przywracając początkowy obraz w postaci listy kolorów, które można wyświetlić.
Jeśli pobierzesz to urocze i otworzysz je w edytorze tekstu, zobaczysz masę bezładnych symboli.

Tutaj używam Notepad++ do przeglądania zawartości pliku, ponieważ tradycyjne edytory tekstu, takie jak Notatnik w Windows, zniszczą plik binarny po zapisaniu, a on przestanie spełniać format JPEG.
Otwierając obraz w edytorze tekstu, mylisz komputer, tak samo jak mylisz swój mózg, gdy pocierasz oczy i zaczynasz widzieć kolorowe plamy!
Plamy, które widzisz, są znane jako , i nie są wynikiem działania stymulacji świetlnej ani halucynacjami wytworzonymi przez umysł. Powstają, ponieważ twój mózg uważa, że wszelkie sygnały elektryczne w nerwach wzrokowych przekazują informacje o świetle. Mózg musi w ten sposób formułować takie przypuszczenia, ponieważ w żaden sposób nie można ustalić, czy sygnał jest dźwiękiem, widzeniem czy czymś innym. Wszystkie nerwy w ciele przekazują dokładnie te same impulsy elektryczne. Naciskając na oczy, wysyłasz sygnały, które nie są wzrokowe, ale aktywują receptory oka, co mózg interpretuje - w tym przypadku błędnie - jako percepcję wzrokową. Dosłownie jesteś w stanie zobaczyć nacisk!
Ciekawe jest myśleć o tym, jak bardzo komputery przypominają mózg, jednak jest to również użyteczna analogia ilustrująca, jak bardzo znaczenie danych – przesyłanych przez ciało nerwami, lub przechowywanych na komputerze – zależy od ich interpretacji. Wszystkie dane binarne składają się z zer i jedynek, podstawowych składników zdolnych do przesyłania informacji wszelkiego rodzaju. Twój komputer często domyśla się, jak je interpretować, korzystając z podpowiedzi, takich jak rozszerzenia plików. A teraz zmuszamy go do interpretowania ich jako tekst, ponieważ tego oczekuje edytor tekstu.
Aby zrozumieć, jak dekodować JPEG, musimy zobaczyć same pierwotne sygnały – dane binarne. Można to zrobić za pomocą edytora szesnastkowego lub bezpośrednio na ! Znajduje się tam obraz, obok którego w polu tekstowym podano wszystkie jego bajty (oprócz nagłówka), przedstawione w postaci dziesiętnej. Możesz je zmieniać, a skrypt przetworzy je i wyświetli nowe zdjęcie w locie.

Można wiele się dowiedzieć, po prostu bawiąc się tym edytorem. Na przykład, czy potrafisz powiedzieć, w jakiej kolejności przechowywane są piksele?
W tym przykładzie dziwne jest to, że zmiana niektórych liczb w ogóle nie wpływa na obraz, a na przykład, jeśli zastąpisz liczbę 17 zerem w pierwszym wierszu, to zdjęcie całkowicie się zepsuje!

Inne zmiany, na przykład zmiana 7 w wierszu 1988 na 254 zmienia kolor, ale tylko następnych pikseli.

Może najbardziej dziwne będzie to, że niektóre liczby zmieniają nie tylko kolor, ale i kształt obrazu. Zmień 70 w wierszu 12 na 2 i zwróć uwagę na górny rząd obrazu, aby zobaczyć, co mam na myśli.

I niezależnie od tego, jakie JPEG używasz, zawsze będziesz znajdować te tajemnicze szachowe sekwencje przy edytowaniu bajtów.
Bawiąc się edytorem, trudno zrozumieć, jak zdjęcie odtwarzane jest z tych bajtów, ponieważ kompresja JPEG składa się z trzech różnych technologii, które są stosowane kolejno na różnych poziomach. Zbadamy każdą z nich osobno, aby odkryć obserwowane przez nas tajemnicze zachowanie.
Trzy poziomy kompresji JPEG:
- .
- .
- , i
Aby zobrazili sobie skalę kompresji, zwróćcie uwagę, że obraz przedstawiony powyżej zawiera 79 819 liczb, czyli około 79 KB. Gdybyśmy przechowywali go bez kompresji, potrzeba by było trzech liczb dla każdego piksela – dla czerwonej, zielonej i niebieskiej składowej. To dałoby 917 700 liczb, czyli około 917 KB. W rezultacie kompresji JPEG końcowy plik zmniejszył się ponad 10 razy!
W rzeczywistości obraz ten można skompresować znacznie bardziej. Poniżej znajdują się dwa obrazy obok siebie – zdjęcie po prawej stronie zostało skompresowane do 16 KB, czyli 57 razy mniej niż wersja nieskompresowana!

Jeśli się przyjrzeć, widać, że te obrazy nie są identyczne. Oba są obrazami z kompresją JPEG, jednak prawy jest znacznie mniejszy pod względem objętości. Wygląda też nieco gorzej (spójrzcie na kwadraty kolorów tła). Dlatego JPEG bywa nazywane kompresją stratną; podczas kompresji obraz zmienia się i traci niektóre szczegóły.
1. Subdyskretizacja kolorów
To obraz z zastosowaniem tylko pierwszego poziomu kompresji.

(Interaktywna wersja – w artykułu). Usunięcie jednego numeru psuje wszystkie kolory. Jednak jeśli usuniemy dokładnie sześć liczb, to praktycznie nie wpływa to na obraz.
Teraz liczby są trochę łatwiejsze do rozszyfrowania. To prawie prosty wykaz kolorów, w którym każdy bajt zmienia dokładnie jeden piksel, ale już jest dwa razy mniejsze niż nieskompresowany obraz (który zajmowałby około 300 KB w takim zredukowanym formacie). Zgadniesz dlaczego?
Widać, że te liczby nie oznaczają standardowych składowych czerwonej, zielonej i niebieskiej, ponieważ jeśli zastąpimy wszystkie liczby zerami, uzyskamy zielony obraz (a nie biały).

Dzieje się tak, ponieważ te bajty oznaczają Y (jasność),

Cb (relatywna niebieskość),

i Cr (relatywna czerwonaweść) obrazu.

Dlaczego nie używać RGB? Przecież tak działa większość nowoczesnych ekranów. Twój monitor może wyświetlać dowolny kolor, w tym czerwony, zielony i niebieski w różnej intensywności dla każdego piksela. Biały uzyskuje się poprzez włączenie wszystkich trzech na pełną jasność, a czarny – poprzez ich wyłączenie.

To także bardzo podobne do działania ludzkiego oka. Receptory kolorów w naszych oczach nazywane są „«, i dzielą się na trzy typy, z których każdy jest bardziej wrażliwy na kolory czerwony, zielony lub niebieski [komórki typu S są wrażliwe na fioletowo-niebieską (S od ang. Short — krótkofalowy), M - na zielono-żółtą (M od ang. Medium — średniofalowy), a L - na żółto-czerwoną (L od ang. Long — długofalowy) część spektrum. Obecność tych trzech rodzajów komórek (i pręcików, wrażliwych na kolor zielony) daje ludziom widzenie kolorów. / przyp. tłum.] , inny typ fotoreceptorów w naszych oczach, który może rejestrować zmiany w jasności, jednak jest znacznie bardziej wrażliwy na kolor. W naszych oczach znajduje się około 120 mln pręcików i tylko 6 mln komórek.
Dlatego nasze oczy znacznie lepiej zauważają zmiany w jasności niż zmiany w kolorze. Jeśli oddzielić kolor od jasności, można usunąć trochę koloru, a nikt niczego nie zauważy. Subdyskretizacja kolorów to proces przedstawiania komponentów kolorowych obrazu w niższej rozdzielczości w porównaniu do komponentów jasności. W powyższym przykładzie każdy piksel ma dokładnie jeden komponent Y, a każda pojedyncza grupa czterech pikseli ma dokładnie jeden komponent Cb i jeden Cr. Z tego powodu obraz zawiera cztery razy mniej informacji o kolorze niż oryginał.
Przestrzeń kolorów YCbCr jest używana nie tylko w JPEG. Została pierwotnie wymyślona w 1938 roku do transmisji telewizyjnych. Nie wszyscy mają kolorowy telewizor, więc rozdzielenie koloru i jasności pozwoliło wszystkim odbierać ten sam sygnał, a telewizory czarno-białe po prostu używały tylko komponentu jasności.
Dlatego usunięcie jednego numeru z edytora całkowicie burzy wszystkie kolory. Komponenty są przechowywane w formie Y Y Y Y Cb Cr (w rzeczywistości, niekoniecznie w tej kolejności – kolejność przechowywania jest określona w nagłówku pliku). Usunięcie pierwszej liczby spowoduje, że pierwsza wartość Cb zostanie odebrana jako Y, Cr jako Cb, co w efekcie da efekt domina, przestawiający wszystkie kolory obrazu.
Specyfikacja JPEG nie wymaga używania YCbCr. Jednak w większości plików jest ona stosowana, ponieważ zapewnia lepszą jakość obrazów po subdyskretizacji w porównaniu do RGB. Nie musicie wierzyć mi na słowo. Sprawdźcie sami w tabeli poniżej, jak będzie wyglądała subdyskretizacja każdego komponentu zarówno w RGB, jak i w YCbCr.

(Interaktywna wersja – w artykuły).
Usunięcie koloru niebieskiego jest mniej zauważalne niż czerwonego czy zielonego. Dzieje się tak, ponieważ z sześciu milionów czopków w waszych oczach około 64% jest wrażliwych na czerwony, 32% na zielony, a 2% na niebieski.
Subdyskretizacja komponentu Y (po lewej w dole) jest najbardziej widoczna. Zauważalne są nawet niewielkie zmiany.
Transformacja obrazu z RGB na YCbCr nie zmniejsza rozmiaru pliku, ale ułatwia znalezienie mniej zauważalnych detali, które można usunąć. Kompresja stratna zachodzi na drugim etapie. Jej podstawą jest idea przedstawienia danych w bardziej kompresowalnej postaci.
2. Dyskretna transformacja cosinusowa i dyskretyzacja
Ten poziom kompresji w dużej mierze określa istotę JPEG. Po przekształceniu kolorów na YCbCr komponenty są kompresowane oddzielnie, dlatego możemy skupić się tylko na komponencie Y. Oto jak wyglądają bajty komponentu Y po zastosowaniu tego poziomu.

(Interaktywna wersja – w artykuły). W interaktywnej wersji kliknięcie na pikselu przewija edytor do wiersza, który go oznacza. Spróbujcie usunąć liczby z końca lub dodać kilka zer do określonej liczby.
Na pierwszy rzut oka wygląda to jak bardzo zła kompresja. W obrazie o 100 000 pikseli, do oznaczenia ich jasności (komponent Y) potrzeba 102 400 liczb — to gorzej niż gdyby w ogóle nic nie kompresować!
Zauważcie jednak, że większość tych liczb wynosi zero. Co więcej, wszystkie te zera na końcu wierszy można usunąć, nie zmieniając obrazu. Pozostaje około 26 000 liczb, a to już prawie cztery razy mniej!
Na tym poziomie kryje się sekret szachowych wzorów. W przeciwieństwie do innych efektów, które widzieliśmy, pojawienie się tych wzorów nie jest błędem. To one są elementami budulcowymi całego obrazu. W każdym wierszu edytora znajduje się dokładnie 64 liczby, współczynniki dyskretnej transformacji cosinusowej (DCT), odpowiadające intensywnościom 64 unikalnych wzorów.
Te wzory są tworzone na podstawie wykresu cosinusa. Oto, jak wyglądają niektóre z nich:

8 z 64 współczynników
Poniżej znajduje się obrazek ilustrujący wszystkie 64 wzory.

(Interaktywna wersja – w artykuły).
Te wzory mają szczególne znaczenie, ponieważ tworzą bazę obrazów o wymiarach 8x8. Jeśli nie jesteś zaznajomiony z algebrą liniową, oznacza to, że każdy obraz o wymiarach 8x8 można otrzymać z tych 64 wzorów. DCT to proces dzielenia obrazów na bloki 8x8 i przekształcania każdego bloku w kombinację tych 64 współczynników.
Że każdy obraz można złożyć z 64 określonych wzorów, wydaje się jak magia. Jednak to samo, co powiedzenie, że każde miejsce na Ziemi można opisać dwoma liczbami – szerokością i długością [z wskazaniem półkul / przyp. tłum.]. Często uważamy powierzchnię Ziemi za dwuwymiarową, więc potrzebujemy tylko dwóch liczb. Obraz 8x8 ma 64 wymiary, dlatego potrzebujemy 64 liczb.
Na razie nie jest jasne, jak to pomaga nam w kwestii kompresji. Jeśli potrzebujemy 64 liczb do reprezentacji obrazu 8x8, dlaczego ten sposób miałby być lepszy niż po prostu zapisywanie 64 komponentów jasności? Robimy to z tej samej przyczyny, dla której przekształciliśmy trzy liczby RGB na trzy liczby YCbCr: pozwala nam to usunąć niewidoczne szczegóły.
Trudno dostrzec, jakie szczegóły są usuwane na tym etapie, ponieważ JPEG stosuje DCT do bloków 8x8. Jednak nikt nie zabrania nam zastosować go do całego obrazu. Oto, jak wygląda DCT dla komponenty Y w zastosowaniu do całego obrazu:

Z końca można usunąć ponad 60 000 liczb praktycznie bez zauważalnych zmian na zdjęciu.

Jednakże zauważ, że jeśli wyzerujemy pierwsze pięć liczb, różnica będzie oczywista.

Liczby na początku oznaczają zmiany niskiej częstotliwości w obrazie, a nasze oczy łapią je najlepiej. Liczby bliżej końca oznaczają zmiany wysokich częstotliwości, które są trudniejsze do zauważenia. Aby "zobaczyć to, co nie jest widoczne gołym okiem", możemy izolować te szczegóły wysokiej częstotliwości, wyzerowując pierwsze 5000 liczb.

Widzimy wszystkie obszary obrazu, w których zachodzi największa zmiana z piksela na piksel. Wyraźnie zaznaczają się oczy kota, jego wąsy, miękki koc i cienie w lewym dolnym rogu. Można pójść dalej, wyzerowując pierwsze 10 000 liczb:

20 000:

40 000:

60 000:

Te szczegółowe detale JPEG są usuwane na etapie kompresji. Przekształcenie kolorów w współczynniki DCT nie niesie strat. Straty powstają na etapie dyskretyzacji, gdzie usuwane są wartości wysokiej częstotliwości lub bliskie zera. Gdy obniżasz jakość zapisu JPEG, program zwiększa próg liczby usuwanych wartości, co prowadzi do zmniejszenia rozmiaru pliku, ale sprawia, że obraz staje się bardziej pikselizowany. Dlatego obraz w pierwszej sekcji, który był 57 razy mniejszy, wyglądał w ten sposób. Każdy blok 8x8 był reprezentowany znacznie mniejszą liczbą współczynników DCT w porównaniu do wersji o wyższej jakości.
Można uzyskać fajny efekt, taki jak stopniowe strumieniowe przesyłanie obrazów. Można wyświetlić rozmyty obraz, który staje się coraz bardziej szczegółowy w miarę pobierania większej liczby współczynników.
Oto, tylko dla ciekawości, co się stanie przy użyciu zaledwie 24 000 liczb:

Lub zaledwie 5000:

Bardzo rozmyte, ale mimo to jakoś rozpoznawalne!
3. Kodowanie długości serii, delta i Huffmana
Jak dotąd wszystkie etapy kompresji były z utratą. Ostatni etap, przeciwnie, odbywa się bez strat. Nie usuwa informacji, ale znacznie zmniejsza rozmiar pliku.
Jak można skompresować coś, nie odrzucając informacji? Wyobraź sobie, jak moglibyśmy opisać prostokąt czarny o wymiarach 700 x 437.
JPEG używa do tego 5000 liczb, ale można osiągnąć znacznie lepszy rezultat. Możesz sobie wyobrazić schemat kodowania, który opisywałby ten obraz jak najmniejszą liczbą bajtów?
Minimalny schemat, który udało mi się wymyślić, używa czterech: trzech do oznaczenia koloru i czwartego - ile pikseli ma taki kolor. Pomysł przedstawiania powtarzających się wartości w ten skompresowany sposób nazywa się kodowaniem długości serii. Nie niesie strat, ponieważ możemy przywrócić zakodowane dane do pierwotnej postaci.
Rozmiar pliku JPEG z czarnym prostokątem jest znacznie większy niż 4 bajty – pamiętaj, że na poziomie DCT kompresja stosowana jest w blokach 8x8 pikseli. W związku z tym potrzebujemy przynajmniej jednego współczynnika DCT na każde 64 piksele. Jeden jest potrzebny, ponieważ zamiast przechowywać jeden współczynnik DCT, po którym następuje 63 zera, kodowanie długości serii pozwala nam przechować jedną liczbę i zaznaczyć, że „wszystkie pozostałe to zera.”
Kodowanie delta to technika, w której każdy bajt zawiera różnicę względem jakiejś wartości, a nie wartość bezwzględną. Dlatego edytowanie określonych bajtów zmienia kolor wszystkich pozostałych pikseli. Na przykład, zamiast przechowywać
12 13 14 14 14 13 13 14
Moglibyśmy zacząć od 12, a następnie po prostu wskazywać, ile należy dodać lub odjąć, aby uzyskać następny numer. A ta sekwencja w kodowaniu delta przybiera postać:
12 1 1 0 0 -1 0 1
Przetworzone dane nie są mniejsze od oryginalnych, ale ich kompresja jest już łatwiejsza. Zastosowanie kodowania delta przed kodowaniem długości serii może znacznie pomóc, pozostając przy tym kompresją bezstratną.
Kodowanie delta to jedna z nielicznych technik stosowanych poza blokami 8x8. Z 64 współczynników DCT jeden to po prostu stała funkcja falowa (jednolity kolor). Reprezentuje średnią jasność każdego bloku dla komponentów jasności lub średnią niebieskość dla komponentów Cb i tak dalej. Pierwsza wartość każdego bloku DCT nazywana jest wartością DC, a każda wartość DC jest kodowana delta w odniesieniu do poprzednich. Dlatego zmiana jasności pierwszego bloku wpłynie na wszystkie bloki.
Pozostaje ostatnia zagadka: jak zmiana jednego numeru całkowicie psuje cały obraz? Dotychczas takie właściwości poziomów kompresji nie były znane. Odpowiedź kryje się w nagłówku JPEG. Pierwsze 500 bajtów zawiera metadane dotyczące obrazu – szerokość, wysokość itd., i dopóki z nimi nie pracowaliśmy.
Bez nagłówka prawie niemożliwe (no, albo bardzo trudne) jest dekodowanie JPEG. Będzie to wyglądać tak, jakbym próbował opisać ci obraz i zaczął wymyślać słowa, aby przekazać swoje wrażenie. Opis będzie prawdopodobnie dość zwięzły, ponieważ mogę wymyślać słowa z dokładnie tym znaczeniem, które chcę przekazać, ale dla wszystkich innych nie będą one miały sensu.
Brzmi to głupio, ale tak właśnie się to dzieje. Każdy obraz JPEG jest kompresowany za pomocą kodów specyficznych dla niego. Słownik tych kodów jest przechowywany w nagłówku. Ta technika nazywana jest „kodem Huffmana”, a słownik – tablicą Huffmana. W nagłówku tabela jest oznaczona dwoma bajtami – 255, a potem 196. Każdy komponent kolorowy może mieć swoją własną tablicę.
Zmiany w tabelach mogą radykalnie wpłynąć na każde zdjęcie. Dobrym przykładem jest zmiana wartości 1 na 12 w 15. linii.

Dzieje się tak, ponieważ w tablicach określa się, jak należy odczytywać poszczególne bity. Do tej pory pracowaliśmy tylko z liczbami binarnymi w systemie dziesiętnym. To jednak ukrywa przed nami fakt, że jeśli chcesz przechować liczbę 1 w bajcie, będzie ona wyglądać jak 00000001, ponieważ w każdym bajcie musi być dokładnie osiem bitów, nawet jeśli potrzebujesz tylko jeden z nich.
Potencjalnie jest to duża strata miejsca, jeśli masz wiele małych liczb. Kod Huffmana to technika, która pozwala nam złagodzić wymaganie, że każda liczba musi zajmować osiem bitów. Oznacza to, że jeśli widzisz dwa bajty:
234 115
To, w zależności od tablicy Huffmana, mogą to być trzy liczby. Aby je wydobyć, musisz najpierw podzielić je na poszczególne bity:
11101010 01110011
Następnie odnosimy się do tablicy, aby zrozumieć, jak je grupować. Na przykład mogą to być pierwsze sześć bitów (111010), czyli 58 w systemie dziesiętnym, po czym następują pięć bitów (10011), czyli 19, a na końcu ostatnie cztery bity (0011), czyli 3.
Dlatego bardzo trudno jest zrozumieć bajty na tym etapie kompresji. Bajty nie przedstawiają tego, co się wydaje. Nie będę zagłębiać się w szczegóły działania z tablicą w tym artykule, ale w tej kwestii w internecie .
Jednym z ciekawych trików, które można zastosować, wiedząc o tym, jest oddzielenie nagłówka od JPEG i przechowywanie go osobno. W zasadzie plik będziesz mógł odczytać tylko ty. Facebook robi to, aby jeszcze bardziej zmniejszyć rozmiar plików.
Co jeszcze można zrobić – to nieco zmienić tablicę Huffmana. Dla innych będzie to wyglądać jak uszkodzony obrazek. Tylko ty będziesz znał magiczną wersję jego naprawy.
Podsumujmy: co jest potrzebne do dekodowania JPEG? Należy:
- Wydobyć tablicę (tablice) Huffmana z nagłówka i zdekodować bity.
- Wyodrębnić współczynniki dyskretnej transformacji kosinusowej dla każdego komponentu koloru i jasności dla każdego bloku 8x8, przeprowadzając odwrotne transformacje kodowania długości serii i różnic.
- Połączyć kosniny na podstawie współczynników, aby uzyskać wartości pikseli dla każdego bloku 8x8.
- Skalować komponenty kolorów, jeśli przeprowadzono subdyspersję (informacja ta jest zawarta w nagłówku).
- Przekształcić uzyskane wartości YCbCr dla każdego piksela na RGB.
- Wyświetlić obraz na ekranie!
To poważna praca, by tylko zobaczyć zdjęcie kota! Jednak to, co mi w tym podoba - widać, jak bardzo technologia JPEG jest zorientowana na człowieka. Opiera się na szczególnych cechach naszego postrzegania, co pozwala osiągnąć znacznie lepsze kompresje niż zwykłe technologie. A teraz, rozumiejąc, jak działa JPEG, można sobie wyobrazić, jak te technologie można przenieść na inne obszary. Na przykład, kodowanie różnic wideo może znacznie zmniejszyć rozmiar pliku, ponieważ często istnieją całe obszary, które nie zmieniają się z klatki na klatkę (na przykład tło).
, jest otwarty i zawiera instrukcje dotyczące zamiany obrazków na własne.
Źródło: habr.com
