Ako funguje formát JPEG

Obrázky vo formáte JPEG sú všadeprítomné v našom digitálnom živote, ale za touto informovanosťou sa skrývajú algoritmy, ktoré odstraňujú detaily, ktoré ľudské oko nevníma. Výsledkom je najvyššia vizuálna kvalita pri najmenšej veľkosti súboru – ale ako presne to všetko funguje? Pozrime sa na to, čo naše oči skutočne nevidia!

Ako funguje formát JPEG

Je ľahké považovať za samozrejmosť možnosť poslať fotografiu priateľovi a nezamýšľať nad tým, aké zariadenie, prehliadač alebo operačný systém používa – ale tak tomu nebolo vždy. Na začiatku 80. rokov počítače vedeli ukladať a zobrazovať digitálne obrázky, ale o najlepšom spôsobe tohto procesu existovalo mnoho konkurenčných nápadov. Nebolo možné len tak poslať obrázok z jedného počítača na iný a dúfať, že všetko bude fungovať.

Aby sa tento problém vyriešil, v roku 1986 bol zriadený výbor odborníkov z celého sveta s názvom „Zjednotená skupina odborníkov na fotografiu“ (Joint Photographic Experts Group, JPEG), ktorá bola založená v rámci spolupráce Medzinárodnej organizácie pre normalizáciu (ISO) a Medzinárodnej elektrotechnickej komisie (IEC) – dvoch medzinárodných normalizačných organizácií so sídlom v Ženeve (Švajčiarsko).

Skupina ľudí nazývaná JPEG vytvorila štandard kompresie digitálnych obrázkov JPEG v roku 1992. Každý, kto používal internet, sa pravdepodobne stretol s obrázkami v kódovaní JPEG. Je to najbežnejší spôsob kódovania, posielania a uchovávania obrázkov. Od webových stránok po e-maily a sociálne médiá, JPEG sa používa miliardami krát denne – takmer vždy, keď sa pozeráme na obrázok online alebo ho posielame. Bez JPEG by bol web menej žiarivý, pomalší a pravdepodobne by obsahoval menej fotografií mačiek!

Tento článok je o tom, ako dešifrovať JPEG obrázok. Inými slovami, hovorí to, čo je potrebné na prevod komprimovaných údajov uložených v počítači na obrázok, ktorý sa zobrazuje na obrazovke. O tom by ste mali vedieť nielen preto, že je to dôležité pre pochopenie technológie, ktorú dennodenne používame, ale aj preto, že odhaľovaním úrovní kompresie lepšie spoznávame vnímanie a zrak, ako aj to, na aké detaily sú naše oči najviac citlivé.

Okrem toho je zábavné experimentovať s obrázkami týmto spôsobom.

Ako funguje formát JPEG

Pohľad dovnútra JPEG

Na počítači je všetko uložené vo forme sekvencie binárnych čísel. Tieto bity, nuly a jednotky sa zvyčajne skupinujú po ôsmich, pričom tvoria bajty. Keď otvoríte JPEG obraz v počítači, niečo (prehliadač, operačný systém, niečo iné) musí dešifrovať bajty a obnoviť pôvodný obrázok vo forme zoznamu farieb, ktoré je možné zobraziť.

Ak si stiahnete túto roztomilú fotografiu mačky a otvoríte ju v textovom editore, uvidíte množstvo nesúvisiacich znakov.

Ako funguje formát JPEG
Tu používam Notepad++ na preskúmanie obsahu súboru, pretože bežné textové editory, ako napríklad Notepad vo Windows, poškodí binárny súbor po jeho uložením a ten prestane zodpovedať formátu JPEG.

Otvorením obrázka v textovom editore zmiatnete počítač rovnako, ako zmiatnete svoj mozog, keď si trieť oči a začnete vidieť farebné škvrny!

Tieto škvrny, ktoré vidíte, sú známe ako fosfény, a nie sú výsledkom pôsobenia svetelného stimulu alebo halucinácií spôsobených mysľou. Vznikajú preto, že váš mozog si myslí, že akékoľvek elektrické signály v očných nervoch prenášajú informácie o svetle. Mozog musí robiť takéto predpoklady, pretože inak nemôže zistiť, či je signál zvukom, víziou alebo niečím iným. Všetky nervy v tele prenášajú úplne rovnaké elektrické impulzy. Tlak na oči posiela signály, ktoré nie sú vizuálne, ale aktivujú receptory v oku, čo váš mozog interpretuje - v tomto prípade nesprávne - ako niečo vizuálne. Ste doslova schopní vidieť tlak!

Je zábavné premýšľať o tom, ako sú počítače podobné mozgu, avšak je to tiež užitočná analógia, ktorá ilustruje, ako veľmi význam dát – prenášaných telom nervami, alebo uložených v počítači – závisí od ich interpretácie. Všetky binárne dáta sa skladajú z núl a jedničiek, základných komponentov schopných prenášať informácie akéhokoľvek druhu. Váš počítač často odhaduje, ako ich interpretovať, pomocou náznakov, ako sú prípony súborov. A teraz ho nútime interpretovať ich ako text, pretože to presne očakáva textový editor.

Aby sme pochopili, ako dekódovať JPEG, musíme vidieť samotné pôvodné signály – binárne dáta. To môžeme urobiť pomocou hexadecimálneho editora, alebo priamo na webovej stránke originálu článku! Tam je obrázok, vedľa ktorého v textovom poli sú uvedené všetky jeho bajty (okrem hlavičky), prezentované v desiatkovej podobe. Môžete ich meniť a skript prekóduje a vydá nový obrázok naživo.

Ako funguje formát JPEG

Môžete sa toho veľa dozvedieť, ak si s týmto editorom pohrajete. Napríklad, viete povedať, v akom poradí sú uložené pixely?

Na tomto príklade je zvláštne to, že zmena niektorých čísel vôbec neovplyvňuje obrázok, ale ak napríklad nahradíte číslo 17 nulou v prvej línii, tak sa fotografia úplne pokazí!

Ako funguje formát JPEG

Iné zmeny, ako napríklad nahradenie 7 v riadku 1988 číslom 254 mení farbu, ale iba nasledujúcich pixelov.

Ako funguje formát JPEG

Možno najzvláštnejšie je, že niektoré čísla menia nielen farbu, ale aj tvar obrázka. Zmeňte 70 v riadku 12 na 2 a pozrite sa na horný rad obrázka, aby ste videli, čo myslím.

Ako funguje formát JPEG

A bez ohľadu na to, aký JPEG obrázok používate, vždy nájdete tieto tajomné šachové sekvencie pri úprave bajtov.

Keď si s editorom hráte, ťažko pochopiť, ako sa fotografia rekonštruuje z týchto bajtov, pretože JPEG kompresia pozostáva z troch rôznych technológií, ktoré sa aplikujú postupne po úrovniach. Preskúmame každú z nich samostatne, aby sme odhalili pozorované tajomné správanie.

Tri úrovne JPEG kompresie:

  1. Súbory s farebnou subdiskretizáciou.
  2. Diskrétne kosínusové transformácie a diskretizácia.
  3. Kódovanie dlhých radov, delta a Huffman

Aby ste si mohli predstavit rozsah kompresie, všimnite si, že obrázok uvedený vyššie obsahuje 79 819 čísel, čo je približne 79 kB. Keby sme ho uložili bez kompresie, pre každé pixel by bolo potrebné tri čísla – pre červenú, zelenú a modrú zložku. To by predstavovalo 917 700 čísel, alebo približne 917 kB. Výsledkom JPEG kompresie sa konečný súbor zmenšil viac ako desaťkrát!

V skutočnosti je možné tento obrázok stlačiť ešte viac. Dole sú uvedené dva obrázky vedľa seba – fotka vpravo bola stlačená na 16 kB, teda 57-krát menej ako nespracovaná verzia!

Ako funguje formát JPEG

Ak sa pozriete pozornejšie, uvidíte, že tieto obrázky nie sú identické. Obe sú obrázky s JPEG kompresiou, avšak pravá je oveľa menšia. Taktiež vyzerá trochu horšie (pozrite sa na štvorce farieb pozadia). Preto sa JPEG nazýva aj kompresiou s stratou; v procese kompresie sa obrázok mení a stráca niektoré detaily.

1. Farebná subdiskrétizácia

Tu je obrázok s použitím len prvej úrovne kompresie.

Ako funguje formát JPEG
(Interaktívna verzia – v origináli článku). Odstránenie jedného čísla rozpadá všetky farby. Avšak ak odstránime presne šesť čísel, má to na obrázok takmer žiadny vplyv.

Teraz sú čísla trochu jednoduchšie na dešifrovanie. Je to takmer jednoduchý zoznam farieb, kde každý bajt mení presne jeden pixel, no je už dvakrát menší ako nespracovaný obrázok (ktorý by mal približne 300 kB v tejto zmenšenej veľkosti). Uhádnete, prečo?

Môžeme vidieť, že tieto čísla neoznačujú štandardné červené, zelené a modré komponenty, pretože ak všetky čísla nahradíme nulami, dostaneme zelený obrázok (a nie biely).

Ako funguje formát JPEG

To je preto, že tieto bajty označujú Y (jasnosť),

Ako funguje formát JPEG

Cb (relatívna modrosť),

Ako funguje formát JPEG

a Cr (relatívna červenosť) obrázka.

Ako funguje formát JPEG

Prečo nepoužiť RGB? Predsa tak funguje väčšina moderných obrazoviek. Váš monitor môže zobraziť akúkoľvek farbu, vrátane červenej, zelenej a modrej farby s rôznou intenzitou pre každý pixel. Biela vzniká zapnutím všetkých troch na plnú jasnosť, zatiaľ čo čierna je ich vypnutím.

Ako funguje formát JPEG

To je tiež veľmi podobné fungovaniu ľudského oka. Farebné receptory našich očí sa nazývajú „čapíky„a delí sa na tri typy, z ktorých každý je citlivejší buď na červenú, alebo na zelenú, alebo na modrú farbu [kužele S-typu sú citlivé vo fialovo-modrej (S z anglického Short – krátkovlnný spektrum), M-typu – v zeleno-žltej (M z anglického Medium – strednovlnný), a L-typu – v žlto-červenej (L z anglického Long – dlhovlnný) častiach spektra. Prítomnosť týchto troch druhov kužeľov (a tyčiniek, citlivých v smaragdovo-zelenom spektre) dáva človeku farebné videnie. / pozn. prekl.] Tyčky, iný typ fotoreceptorov v našich očiach, schopný zachytávať zmeny v jasnosti, je však oveľa citlivejší na farbu. V našich očiach je približne 120 miliónov tyčiniek a iba 6 miliónov kužeľov.

Preto naše oči oveľa lepšie zaznamenávajú zmeny v jasnosti než zmeny vo farbe. Ak oddelíme farbu od jasnosti, môžeme odstrániť trochu farby a nikto si toho nevšimne. Farbová subdyspretizácia – to je proces predstavenia farebných komponentov obrázka v menšom rozlíšení v porovnaní s komponentmi jasnosti. V horeuvedenom príklade má každý pixel presne jeden komponent Y, a každá samostatná skupina štyroch pixelov má presne jednu komponentu Cb a jednu Cr. Preto obrázok obsahuje štyrikrát menej farebných informácií, než mal originál.

Farebné priestory YCbCr sa používajú nielen v JPEG. Boli pôvodne vymyslené v roku 1938 pre televízne vysielanie. Nie všetci majú farebnú televíziu, a preto rozdelenie farby a jasnosti umožnilo všetkým prijímať signál rovnakým spôsobom, zatiaľ čo televízory bez farby jednoducho používali iba jasnostný komponent.

Preto odstránenie jedného čísla z editora úplne rozpadá všetky farby. Komponenty sa ukladajú vo forme Y Y Y Y Cb Cr (v skutočnosti nie je tento poriadok nutný – poradie ukladania je určené v hlavičke súboru). Odstránenie prvého čísla spôsobí, že prvá hodnota Cb bude vnímaná ako Y, Cr ako Cb, a celkovo vznikne efekt domina, ktorý prehadzuje všetky farby obrázka.

Špecifikácia JPEG vás nezaväzuje používať YCbCr. Ale vo väčšine súborov sa používa, pretože poskytuje kvalitnejšie obrázky po subdiskretizácii v porovnaní s RGB. No nemusíte mi veriť na slovo. Pozrite sa sami v tabuľke nižšie, ako bude vyzerať subdiskretizácia každého jednotlivého komponentu v RGB aj YCbCr.

Ako funguje formát JPEG
(Interaktívna verzia – v origináli články).

Odstránenie modrej nie je také zreteľné ako červená alebo zelená. Je to preto, že z šiestich miliónov čapíkov vo vašich očiach je približne 64 % citlivých na červenú, 32 % na zelenú a 2 % na modrú.

Subdiskretizácia komponentu Y (vľavo dole) je najviditeľnejšia. Viditeľná je aj malá zmena.

Prevod obrázka z RGB na YCbCr nezmenšuje veľkosť súboru, ale uľahčuje hľadanie menej viditeľných detailov, ktoré je možné odstrániť. Stratová kompresia prebieha v druhom kroku. Jej základom je myšlienka predstaviť dáta v komprimovanej forme.

2. Diskrétna kosínusová transformácia a diskretizácia

Tento úroveň kompresie vo veľkej miere určuje podstatu JPEG. Po prevode farieb na YCbCr sa komponenty komprimujú samostatne, takže sa môžeme sústrediť len na komponent Y. A takto vyzerajú bajty komponentu Y po aplikácii tejto úrovne.

Ako funguje formát JPEG
(Interaktívna verzia – v origináli články). V interaktívnej verzii kliknutie na pixel posúva editor na riadok, ktorý ho označuje. Skúste odstrániť čísla na konci alebo pridať niekoľko núl k určitému číslu.

Na prvý pohľad to vyzerá ako veľmi zlé stlačenie. Na obrázku je 100 000 pixelov a na označenie ich jasnosti (Y-komponenty) je potrebných 102 400 čísel – je to horšie, ako keby sme vôbec nič nestlačili!

Avšak vezmite na vedomie, že väčšina týchto čísel je nula. Navyše, všetky tieto nuly na konci riadkov je možné odstrániť bez zmeny obrázka. Zostáva približne 26 000 čísel, čo je už takmer 4-krát menej!

Na tejto úrovni sa skrýva tajomstvo šachových vzorov. Na rozdiel od iných efektov, ktoré sme videli, vznik týchto vzorov nie je chyba. Sú to stavebné bloky celého obrazu. V každom riadku editora je presne 64 čísel, koeficienty diskrétnej kosínusovej transformácie (DCT), ktoré zodpovedajú intenzitám 64 unikátnych vzorov.

Tieto vzory sa vytvárajú na základe grafu kosínusu. Toto sú niektoré z nich:

Ako funguje formát JPEG
8 z 64 koeficientov

Nižšie je obrázok, ktorý zobrazuje všetky 64 vzorov.

Ako funguje formát JPEG
(Interaktívna verzia – v origináli články).

Tieto vzory majú osobitný význam, pretože vytvárajú základ pre obrázky veľkosti 8x8. Ak nie ste oboznámení s lineárnou algebrou, znamená to, že akýkoľvek obrázok veľkosti 8x8 možno získať z týchto 64 vzorov. DCT je proces rozdeľovania obrázkov na bloky 8x8 a transformácie každého bloku na kombináciu z týchto 64 koeficientov.

To, že akýkoľvek obrázok možno poskladať z 64 určených vzorov, sa zdá ako mágia. Avšak je to to isté, ako povedať, že každé miesto na Zemi možno opísať dvoma číslami – zemepisnou šírkou a dĺžkou [s uvedením pologuli / pozn. prekl.]. Často považujeme povrch Zeme za dvojrozmerný, a preto nám stačia len dve čísla. Obrázok 8x8 má 64 dimenzií, preto potrebujeme 64 čísel.

Zatiaľ nie je jasné, ako nám to pomáha z hľadiska kompresie. Ak potrebujeme 64 čísel na reprezentáciu obrázka 8x8, prečo by tento spôsob mal byť lepší než len uložiť 64 komponentov jasu? Robíme to z rovnakého dôvodu, z akého sme premenili tri čísla RGB na tri čísla YCbCr: to nám umožňuje odstrániť neviditeľné detaily.

Je ťažké vidieť, ktoré presne detaily sa odstraňujú v tomto štádiu, pretože JPEG aplikuje DCT na bloky 8x8. Avšak nikto nám nebráni aplikovať ho na celý obrázok. Toto je, ako vyzerá DCT na komponente Y pri aplikácii na celý obrázok:

Ako funguje formát JPEG

Z konca môžeme odstrániť viac ako 60 000 čísiel takmer bez viditeľných zmien na fotografii.

Ako funguje formát JPEG

Avšak majte na pamäti, že ak nulujeme prvých päť čísel, rozdiel bude zjavný.

Ako funguje formát JPEG

Čísla na začiatku označujú zmeny nízkej frekvencie v obrázku a naše oči ich zachytávajú najlepšie. Čísla bližšie ku koncu označujú zmeny vysokých frekvencií, ktoré sú ťažšie postrehnuteľné. Aby sme 'videli to, čo nie je vidieť okom', môžeme isolovať tieto detaily vysokej frekvencie, ak obmedzíme prvých 5000 čísel.

Ako funguje formát JPEG

Vidíme všetky oblasti obrázka, kde dochádza k najväčším zmenám od pixelu k pixelu. Vynikajú oči mačky, jej fúzy, chlpatá deka a tiene v ľavom dolnom rohu. Môžeme ísť ešte ďalej a nulovať prvých 10 000 čísel:

Ako funguje formát JPEG

20 000:

Ako funguje formát JPEG

40 000:

Ako funguje formát JPEG

60 000:

Ako funguje formát JPEG

Tieto vysokofrekvenčné detaily JPEG sa odstraňujú počas kompresie. Prevod farieb na koeficienty DCT je bezstratový. Straty nastáva počas kroku diskrétizácie, kde sa odstraňujú hodnoty vysokých frekvencií alebo blízke k nule. Keď znížite kvalitu uloženia JPEG, program zvyšuje prah počtu odstraňovaných hodnôt, čo vedie k zmenšeniu veľkosti súboru, ale robí obrázok viac pixelizovaným. Preto obrázok v prvom oddiele, ktorý bol 57-krát menší, takto vyzeral. Každý blok 8x8 bol reprezentovaný omnoho menším počtom koeficientov DCT v porovnaní s kvalitnejšou verziou.

Môžete dosiahnuť taký skvelý efekt, ako je postupné streamovanie obrázkov. Môžete zobraziť rozmazaný obrázok, ktorý sa stáva čoraz podrobnejším, keď sa sťahuje čoraz viac koeficientov.

Tu, len zo zvedavosti, čo sa stane pri použití len 24 000 čísel:

Ako funguje formát JPEG

Alebo len 5000:

Ako funguje formát JPEG

Veľmi rozmazané, ale akoby rozpoznateľné!

3. Kódovanie dlhých sérií, delta a Huffmanov algoritmus

Doteraz všetky fázy kompresie prebiehali so stratami. Posledná fáza, naopak, prebieha bez strát. Neodstraňuje informácie, avšak významne znižuje veľkosť súboru.

Ako môžeme niečo skompresovať bez toho, aby sme zahodili informácie? Predstavte si, ako by sme opísali jednoduchý čierny obdĺžnik 700 x 437.

JPEG na to využíva 5000 čísel, ale môžeme dosiahnuť oveľa lepšie výsledky. Môžete si predstaviť schému kódovania, ktorá by opísala podobný obrázok čo najmenším počtom bajtov?

Minimálna schéma, ktorú som dokázal vymyslieť, používa štyri: tri na označenie farby a štvrtý – koľko pixelov má takú farbu. Myšlienka reprezentácie opakujúcich sa hodnôt týmto stlačeným spôsobom sa nazýva kódovanie dlhých sérií. Je bezstratové, pretože môžeme obnoviť zakódované údaje v pôvodnej podobe.

Veľkosť súboru JPEG s čiernym obdĺžnikom je oveľa väčšia ako 4 bajty – nezabúdajte, že na úrovni DCT sa kompresia aplikuje na bloky 8x8 pixelov. Preto potrebujeme aspoň jeden DCT koeficient na každých 64 pixelov. Jeden koeficient je potrebný, pretože namiesto toho, aby sme uchovávali jeden DCT koeficient a za ním 63 núl, kódovanie dlhých sérií nám umožňuje uchovávať jedno číslo a označiť, že „všetky ostatné sú nuly“.

Delta kódovanie je technika, pri ktorej každý bajt obsahuje rozdiel od nejakého hodnoty, nie absolútnu hodnotu. Preto úprava určitých bajtov mení farbu všetkých ostatných pixelov. Napríklad, namiesto toho, aby sme uchovávali

12 13 14 14 14 13 13 14

Mohli by sme začať s 12 a potom jednoducho označiť, o koľko je potrebné pridať alebo odpočítať, aby sme dostali ďalšie číslo. A táto sekvencia v delta kódovaní nadobúda tvar:

12 1 1 0 0 -1 0 1

Transformované údaje nie sú menšie ako pôvodné, ale kompresia je už oveľa jednoduchšia. Aplikácia delta kódovania pred kódovaním dlhých sérií môže veľmi pomôcť a pritom zostáva bezstratovou kompresiou.

Delta kódovanie je jedna z mála techník, ktoré sa aplikujú mimo bloky 8x8. Z 64 DCT koeficientov je jeden jednoducho konštantná vlnová funkcia (jednofarebná). Predstavuje priemernú jasnosť každého bloku pre komponenty jasu, alebo priemernú modrosť pre komponenty Cb, a tak ďalej. Prvá hodnota každého DCT bloku sa nazýva DC hodnota a každá DC hodnota prechádza delta kódovaním vo vzťahu k predchádzajúcim. Preto zmena jasnosti prvého bloku ovplyvní všetky bloky.

Zostáva posledná záhada: ako zmena jedinečného čísla úplne pokazí celý obrázok? Doposiaľ také vlastnosti úrovní kompresie neexistovali. Odpoveď leží v hlavičke JPEG. Prvých 500 bajtov obsahuje metadáta o obrázku – šírku, výšku a podobne, a pokiaľ sa s nimi nepracovalo.

Bez hlavičky je takmer nemožné (alebo dosť ťažké) dekódovať JPEG. Vyzeralo by to tak, akoby som sa snažil opísať vám obraz a začínal by som vymýšľať slová, aby som preniesol svoj dojem. Opis by bol pravdepodobne veľmi skrátený, pretože by som mohol vymýšľať slová presne s tým významom, ktorý chcem preniesť; avšak pre všetkých ostatných by nedávali zmysel.

Znie to hlúpo, ale presne tak to funguje. Každý JPEG obrázok je komprimovaný s kódmi, ktoré sú pre neho špecifické. Slovník kódov sa uloží v hlavičke. Táto technika sa nazýva „Huffmanovo kódovanie“ a slovník je Huffmanova tabuľka. V hlavičke je tabuľka označená dvoma bajtmi – 255 a potom 196. Každá farebná zložka môže mať svoju vlastnú tabuľku.

Zmeny tabuliek radikálne ovplyvnia akýkoľvek obrázok. Dobrým príkladom je zmena 1 na 12 v 15. riadku.

Ako funguje formát JPEG

To sa deje preto, že v tabuľkách je uvedené, ako treba čítať jednotlivé bity. Doteraz sme pracovali iba s dvojkovými číslami v desiatkovej podobe. Ale to nám zakrýva fakt, že ak chcete uložiť číslo 1 v bajte, bude to vyzerať ako 00000001, pretože v každom bajte musí byť presne osem bitov, aj keď potrebujete len jeden.

Potenciálne je to veľká strata miesta, ak máte veľa drobných čísel. Huffmanovo kódovanie je technika, ktorá nám umožňuje oslabiť tento požiadavok, že každé číslo musí zaberať osem bitov. To znamená, že ak vidíte dva bajty:

234 115

Potom, v závislosti od Huffmanovej tabuľky, to môžu byť tri čísla. Aby ste ich extrahovali, musíte ich najprv rozdeliť na jednotlivé bity:

11101010 01110011

Potom sa obraciame na tabuľku, aby sme pochopili, ako ich skupinovať. Napríklad, to môžu byť prvé šesť bitov (111010), alebo 58 v desiatkovej sústave, za ktorými nasleduje päť bitov (10011), alebo 19, a nakoniec posledné štyri bity (0011), alebo 3.

Preto je veľmi ťažké sa v bajtoch zorientovať v tomto štádiu kompresie. Bajty nepredstavujú to, čo sa zdá. Nechcem sa v tejto článku zaoberať detailmi práce s tabuľkou, ale materiálov v tejto otázke je na internete stačí.

Jeden z zaujímavých triků, ktoré sa dajú robiť, keď to viete – oddeliť hlavičku od JPEG a uchovávať ju samostatne. V podstate tak bude súbor čitateľný iba pre vás. Facebook to robí, aby ešte viac zmenšil súbory.

Čo ďalšie môžete urobiť – trochu zmeniť Huffmanovu tabuľku. Pre ostatných to bude vyzerať ako poškodený obrázok. A len vy budete vedieť kúzelnú verziu jej opravy.

Zhrňme to: čo teda potrebujeme na dekódovanie JPEG? Je potrebné:

  1. Vyťažiť tabuľku (tabuľky) Huffman z hlavičky a dekódovať bity.
  2. Extrahujte koeficienty diskrétního kosinového transformace pro každou barevnou a jasovou složku pro každý blok 8x8 tím, že provedete zpětné transformace kódování řady a delta.
  3. Kombinujte kosinusy na základě koeficientů, abyste získali hodnoty pixelů pro každý blok 8x8.
  4. Změňte měřítko barevných komponentů, pokud byla provedena subdiskretizace (tato informace je v hlavičce).
  5. Převeďte získané hodnoty YCbCr pro každý pixel na RGB.
  6. Zobrazte obrázek na obrazovce!

To je vážná práce pro jednoduché prohlížení fotek s kočkou! Co se mi na tom líbí, je, jak technika JPEG zohledňuje lidské vnímání, což umožňuje dosáhnout mnohem lepšího komprese než běžné technologie. A nyní, když rozumíme, jak JPEG funguje, můžeme si představit, jak by tyto technologie mohly být použity i v jiných oblastech. Například delta-kódování ve videu může výrazně snížit velikost souboru, protože existují celé oblasti, které se od snímku k snímku nemění (například pozadí).

Kód použitý v článku, je otevřený a obsahuje pokyny, jak nahradit obrázky svými vlastními.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster