Kaip veikia JPEG formatas

JPEG vaizdai yra visur mūsų skaitmeniniame gyvenime, tačiau už šios suvokimo faneros slypi algoritmai, pašalinantys žmogaus akiai nepastebimas detales. Rezultatas – aukščiausia vaizdo kokybė mažiausiu failo dydžiu – bet kaip tiksliai visa tai veikia? Pažiūrėkime, ko tiksliai mūsų akys nemato!

Kaip veikia JPEG formatas

Galimybę nusiųsti draugui nuotrauką ir nesijaudinti, kokį įrenginį, naršyklę ar operacinę sistemą jis naudoja, nesunku laikyti savaime suprantamu dalyku, tačiau taip buvo ne visada. Devintojo dešimtmečio pradžioje kompiuteriai galėjo saugoti ir rodyti skaitmeninius vaizdus, ​​tačiau buvo daug konkuruojančių idėjų apie geriausią būdą tai padaryti. Negalite tiesiog nusiųsti vaizdo iš vieno kompiuterio į kitą ir tikėtis, kad jis veiks.

Norėdami išspręsti šią problemą, 1986 m. buvo suburtas ekspertų iš viso pasaulio komitetas, vadinamas "Jungtinė fotografijos ekspertų grupė» (Joint Photography Experts Group, JPEG), įkurta bendromis Tarptautinės standartizacijos organizacijos (ISO) ir Tarptautinės elektrotechnikos komisijos (IEC), dviejų tarptautinių standartų organizacijų, kurių būstinė yra Ženevoje, Šveicarijoje, pastangomis.

Grupė žmonių, vadinamų JPEG, sukūrė JPEG skaitmeninio vaizdo glaudinimo standartą 1992 m. Kiekvienas, kuris naudojosi internetu, tikriausiai yra susidūręs su JPEG koduotais vaizdais. Tai labiausiai paplitęs vaizdų kodavimo, siuntimo ir saugojimo būdas. Nuo tinklalapių iki el. pašto iki socialinių tinklų JPEG yra naudojamas milijardus kartų per dieną – praktiškai kiekvieną kartą, kai peržiūrime vaizdą internete arba jį siunčiame. Be JPEG žiniatinklis būtų ne toks spalvingas, lėtesnis ir tikriausiai būtų mažiau kačių nuotraukų!

Šis straipsnis yra apie tai, kaip iššifruoti JPEG vaizdą. Kitaip tariant, ko reikia kompiuteryje saugomiems suspaustiems duomenims paversti ekrane pasirodančiu vaizdu. Tai verta žinoti ne tik todėl, kad svarbu suprasti kasdien naudojamas technologijas, bet ir todėl, kad atrakinę suspaudimo lygius sužinome daugiau apie suvokimą ir regėjimą bei kokias detales mūsų akys yra jautriausios.

Be to, taip žaisti vaizdais labai įdomu.

Kaip veikia JPEG formatas

Žvelgiant į JPEG vidų

Kompiuteryje viskas saugoma kaip dvejetainių skaičių seka. Paprastai šie bitai, nuliai ir vienetai, yra sugrupuoti į aštuonias grupes, kad sudarytų baitus. Kai kompiuteryje atidarote JPEG vaizdą, kažkas (naršyklė, operacinė sistema, dar kažkas) turi iššifruoti baitus, atkuriant pradinį vaizdą kaip spalvų, kurias galima rodyti, sąrašą.

Jei atsisiųsite šį saldumyną katės nuotrauka ir atidarykite jį teksto rengyklėje, pamatysite krūvą nenuoseklių simbolių.

Kaip veikia JPEG formatas
Čia aš naudoju „Notepad++“, kad ištirčiau failo turinį, nes įprasti teksto rengyklės, tokios kaip „Windows Notepad“, sugadins dvejetainį failą po išsaugojimo ir nebeatitinka JPEG formato.

Vaizdo atidarymas tekstų rengyklėje supainioja kompiuterį, lygiai taip pat, kaip supainioja smegenis, kai trina akis ir pradeda matyti spalvų dėmes!

Šios dėmės, kurias matote, yra žinomos kaip fosfenai, ir nėra šviesos dirgiklio ar proto sukeltų haliucinacijų rezultatas. Jie atsiranda todėl, kad jūsų smegenys mano, kad bet kokie regos nervų elektriniai signalai perduoda informaciją apie šviesą. Smegenys turi daryti šias prielaidas, nes nėra būdo žinoti, ar signalas yra garsas, regėjimas ar kažkas kita. Visi kūno nervai perduoda lygiai tuos pačius elektrinius impulsus. Spaudžiant akis, jūs siunčiate signalus, kurie nėra vizualūs, o suaktyvina akies receptorius, kuriuos jūsų smegenys interpretuoja – šiuo atveju neteisingai – kaip kažką vaizdinio. Jūs tiesiogine prasme matote spaudimą!

Juokinga pagalvoti, kuo kompiuteriai yra panašūs į smegenis, tačiau tai taip pat yra naudinga analogija, iliustruojanti, kiek duomenų reikšmė – nesvarbu, ar jie pernešami per kūną, ar saugomi kompiuteryje – priklauso nuo to, kaip jie interpretuojami. Visi dvejetainiai duomenys yra sudaryti iš 0 ir 1 – pagrindinių komponentų, kurie gali perduoti bet kokios rūšies informaciją. Jūsų kompiuteris dažnai sugalvoja, kaip juos interpretuoti naudodamas tokius įkalčius kaip failų plėtiniai. Dabar mes priverčiame juos interpretuoti kaip tekstą, nes to tikisi teksto rengyklė.

Norėdami suprasti, kaip iššifruoti JPEG, turime pamatyti pačius originalius signalus – dvejetainius duomenis. Tai galima padaryti naudojant šešioliktainį redaktorių arba tiesiogiai originalaus straipsnio tinklalapis! Yra paveikslėlis, šalia kurio teksto lauke yra visi jo baitai (išskyrus antraštę), pateikiami dešimtaine forma. Galite juos pakeisti, o scenarijus iš naujo užkoduos ir sukurs naują vaizdą.

Kaip veikia JPEG formatas

Galite daug išmokti tiesiog žaisdami su šiuo redaktoriumi. Pavyzdžiui, ar galite pasakyti, kokia tvarka yra saugomi pikseliai?

Keisčiausias dalykas šiame pavyzdyje yra tas, kad kai kurių skaičių pakeitimas vaizdui visiškai nedaro įtakos, bet, pavyzdžiui, jei pirmoje eilutėje skaičių 17 pakeisite 0, nuotrauka bus visiškai sugadinta!

Kaip veikia JPEG formatas

Kiti pakeitimai, pvz., 7 eilutėje 1988 pakeitus skaičiumi 254, keičia spalvą, bet tik vėlesnių pikselių.

Kaip veikia JPEG formatas

Turbūt keisčiausia, kad kai kurie skaičiai keičia ne tik spalvą, bet ir vaizdo formą. Pakeiskite 70 12 eilutėje į 2 ir pažiūrėkite į viršutinę vaizdo eilutę, kad suprastumėte, ką turiu omenyje.

Kaip veikia JPEG formatas

Ir nesvarbu, kokį JPEG vaizdą naudojate, redaguodami baitus visada rasite šiuos paslaptingus šachmatų raštus.

Žaidžiant su redaktoriumi sunku suprasti, kaip iš šių baitų atkuriama nuotrauka, nes JPEG glaudinimas susideda iš trijų skirtingų technologijų, nuosekliai taikomų lygiais. Mes išnagrinėsime kiekvieną atskirai, kad atskleistume paslaptingą elgesį, kurį matome.

Trys JPEG glaudinimo lygiai:

  1. Spalvų atranka.
  2. Diskretinė kosinuso transformacija ir atranka.
  3. Vykdymo ilgio kodavimas, delta и Huffmanas

Kad suprastumėte suspaudimo dydį, atkreipkite dėmesį, kad aukščiau pateiktame paveikslėlyje yra 79 819 skaičiai arba apie 79 KB. Jei saugotume jį be suspaudimo, kiekvienam pikseliui reikėtų trijų skaičių – raudonos, žalios ir mėlynos spalvos komponentams. Tai sudarytų 917 700 numerių arba apytiksliai. 917 KB. Dėl JPEG suspaudimo galutinis failas sumažėjo daugiau nei 10 kartų!

Tiesą sakant, šį vaizdą galima suspausti daug daugiau. Žemiau yra du vaizdai vienas šalia kito – nuotrauka dešinėje buvo suglaudinta iki 16 KB, tai yra 57 kartus mažesnė nei nesuspausta versija!

Kaip veikia JPEG formatas

Jei atidžiai įsižiūrėsite, pamatysite, kad šie vaizdai nėra identiški. Abu jie yra JPEG suspaudimo vaizdai, tačiau dešinysis yra daug mažesnio tūrio. Tai taip pat atrodo šiek tiek prasčiau (pažiūrėkite į fono spalvų kvadratus). Štai kodėl JPEG taip pat vadinamas nuostolingu glaudinimu; Suspaudimo proceso metu vaizdas pasikeičia ir praranda kai kurias detales.

1. Spalvų atranka

Čia yra vaizdas, kuriame taikomas tik pirmasis suspaudimo lygis.

Kaip veikia JPEG formatas
(Interaktyvi versija – in originalus straipsniai). Vieno skaičiaus pašalinimas sunaikina visas spalvas. Tačiau jei pašalinami tiksliai šeši skaičiai, tai praktiškai neturi jokios įtakos vaizdui.

Dabar skaičius yra šiek tiek lengviau iššifruojamas. Tai kone paprastas spalvų sąrašas, kuriame kiekvienas baitas keičia lygiai po vieną pikselį, bet tuo pačiu jau yra perpus mažesnis už nesuspaustą vaizdą (kuris tokiu sumažintu dydžiu užimtų apie 300 KB). Ar galite atspėti kodėl?

Matote, kad šie skaičiai neatspindi standartinių raudonos, žalios ir mėlynos spalvos komponentų, nes jei visus skaičius pakeisime nuliais, gausime žalią vaizdą (o ne baltą).

Kaip veikia JPEG formatas

Taip yra todėl, kad šie baitai reiškia Y (ryškumą),

Kaip veikia JPEG formatas

Cb (santykinis mėlynumas),

Kaip veikia JPEG formatas

ir Cr (santykinis raudonis) nuotraukos.

Kaip veikia JPEG formatas

Kodėl gi ne naudoti RGB? Juk taip veikia dauguma šiuolaikinių ekranų. Jūsų monitorius gali rodyti bet kokią spalvą, įskaitant raudoną, žalią ir mėlyną, su skirtingu kiekvieno pikselio intensyvumu. Balta spalva gaunama įjungus visus tris visu ryškumu, o juoda – jas išjungus.

Kaip veikia JPEG formatas

Tai taip pat labai panašu į tai, kaip veikia žmogaus akis. Mūsų akių spalvų receptoriai vadinami "kūgiai“, ir yra suskirstyti į tris tipus, kurių kiekvienas yra jautresnis raudonai, žaliai arba mėlynai spalvoms [S tipo kūgiai yra jautrūs violetinės-mėlynos spalvos (S iš anglų kalbos Short – trumpųjų bangų spektras), M. -tipo - žaliai geltonoje (M iš anglų kalbos - vidutinė banga), o L tipo - geltonai raudonoje (L iš anglų kalbos Long - ilgoji banga) spektro dalyse. Šių trijų tipų kūgiai (ir strypai, kurie yra jautrūs smaragdo žaliajai spektro daliai) suteikia žmogui spalvų matymą. / apytiksliai vertimas]. Lazdos, kitas mūsų akių fotoreceptorių tipas, gali aptikti ryškumo pokyčius, tačiau yra daug jautresnis spalvoms. Mūsų akys turi apie 120 milijonų lazdelių ir tik 6 milijonus kūgių.

Štai kodėl mūsų akys daug geriau nustato ryškumo pokyčius nei spalvos pokyčius. Jei atskirsite spalvą nuo ryškumo, galite pašalinti šiek tiek spalvos ir niekas nieko nepastebės. Chroma subsampling – tai vaizdo spalvų komponentų atvaizdavimas mažesne skiriamąja geba nei skaisčio komponentai. Aukščiau pateiktame pavyzdyje kiekvienas pikselis turi tiksliai vieną Y komponentą, o kiekviena atskira keturių pikselių grupė turi tiksliai vieną Cb ir vieną Cr komponentą. Todėl vaizde yra keturis kartus mažiau spalvų informacijos nei originale.

YCbCr spalvų erdvė naudojama ne tik JPEG. Iš pradžių jis buvo išrastas 1938 m. televizijos programoms. Ne visi turi spalvotą televizorių, todėl spalvų ir ryškumo atskyrimas leido visiems gauti tą patį signalą, o televizoriai be spalvų tiesiog naudojo tik ryškumo komponentą.

Taigi, pašalinus vieną skaičių iš redaktoriaus, visos spalvos visiškai sugadina. Komponentai saugomi YYYY Cb Cr forma (tiesą sakant, nebūtinai tokia tvarka – saugojimo tvarka nurodyta failo antraštėje). Pašalinus pirmąjį skaičių, pirmoji Cb reikšmė bus suvokiama kaip Y, Cr kaip Cb, ir apskritai turėsite domino efektą, kuris perjungs visas paveikslėlio spalvas.

JPEG specifikacija neverčia naudoti YCbCr. Tačiau dauguma failų jį naudoja, nes sukuria geresnius atrinktus vaizdus nei RGB. Bet jūs neprivalote priimti mano žodžio. Žemiau esančioje lentelėje pažiūrėkite, kaip atrodys kiekvieno atskiro komponento atranka tiek RGB, tiek YCbCr.

Kaip veikia JPEG formatas
(Interaktyvi versija – in originalus straipsniai).

Mėlynos spalvos pašalinimas nėra toks pastebimas kaip raudonos ar žalios spalvos. Taip yra todėl, kad jūsų akyse yra šeši milijonai spurgų, apie 64% yra jautrūs raudonai, 32% - žaliai ir 2% - mėlynai.

Geriausiai matomas Y komponento atranka (apačioje kairėje). Net nedidelis pokytis pastebimas.

Vaizdo konvertavimas iš RGB į YCbCr nesumažina failo dydžio, tačiau padeda lengviau rasti mažiau matomas detales, kurias galima pašalinti. Antrajame etape atsiranda nuostolingas suspaudimas. Jis pagrįstas idėja pateikti duomenis labiau suspaudžiama forma.

2. Diskretinė kosinuso transformacija ir atranka

Šis glaudinimo lygis dažniausiai yra JPEG. Konvertavus spalvas į YCbCr, komponentai suglaudinami atskirai, todėl galime susikoncentruoti tik į Y komponentą. Štai kaip atrodo Y komponento baitai pritaikę šį sluoksnį.

Kaip veikia JPEG formatas
(Interaktyvi versija – in originalus straipsniai). Interaktyvioje versijoje spustelėjus pikselį redaktorius slenka iki jį žyminčios eilutės. Pabandykite pašalinti skaičius iš galo arba pridėti kelis nulius prie tam tikro skaičiaus.

Iš pirmo žvilgsnio atrodo, kad suspaudimas labai blogas. Vaizde yra 100 000 pikselių, o jų ryškumui parodyti reikia 102 400 skaičių (Y komponentai) – tai dar blogiau nei nieko nesuspausti!

Tačiau atminkite, kad dauguma šių skaičių yra nulis. Be to, visus tuos nulius eilučių gale galima pašalinti nekeičiant vaizdo. Liko apie 26 000 skaičių, ir tai yra beveik 4 kartus mažiau!

Šiame lygyje yra šachmatų šablonų paslaptis. Skirtingai nuo kitų efektų, kuriuos matėme, šių raštų išvaizda nėra gedimas. Jie yra viso įvaizdžio sudedamosios dalys. Kiekvienoje redaktoriaus eilutėje yra tiksliai 64 skaičiai, diskrečiųjų kosinuso transformacijos (DCT) koeficientai, atitinkantys 64 unikalių šablonų intensyvumą.

Šie raštai formuojami remiantis kosinuso brėžiniu. Štai kaip atrodo kai kurie iš jų:

Kaip veikia JPEG formatas
8 iš 64 šansų

Žemiau yra vaizdas, kuriame rodomi visi 64 modeliai.

Kaip veikia JPEG formatas
(Interaktyvi versija – in originalus straipsniai).

Šie raštai yra ypač svarbūs, nes jie sudaro 8x8 vaizdų pagrindą. Jei nesate susipažinę su linijine algebra, tai reiškia, kad iš šių 8 šablonų galima padaryti bet kokį 8x64 vaizdą. DCT yra vaizdų padalijimas į 8x8 blokus ir kiekvieno bloko konvertavimas į šių 64 koeficientų derinį.

Atrodo kaip magija, kad bet koks vaizdas gali būti sudarytas iš 64 konkrečių raštų. Tačiau tai tas pats, kas sakyti, kad bet kurią vietą Žemėje galima apibūdinti dviem skaičiais – platuma ir ilguma [nurodant pusrutulius / apytiksl. vertimas]. Mes dažnai manome, kad Žemės paviršius yra dvimatis, todėl mums reikia tik dviejų skaičių. 8x8 vaizdas turi 64 matmenis, todėl mums reikia 64 skaičių.

Dar neaišku, kaip tai mums padeda suspaudimo požiūriu. Jei mums reikia 64 skaičių, kad pavaizduotume 8x8 vaizdą, kodėl tai būtų geriau nei tik saugoti 64 ryškumo komponentus? Tai darome dėl tos pačios priežasties, kodėl tris RGB skaičius pavertėme trimis YCbCr skaičiais: tai leidžia pašalinti subtilias detales.

Sunku tiksliai suprasti, kokia detalė buvo pašalinta šiame etape, nes JPEG taiko DCT 8x8 blokams. Tačiau niekas nedraudžia mums to pritaikyti visam paveikslui. Štai kaip DCT atrodo Y komponentui, pritaikytam visam paveikslėliui:

Kaip veikia JPEG formatas

Iš galo galima pašalinti daugiau nei 60 000 skaičių be pastebimų nuotraukos pakeitimų.

Kaip veikia JPEG formatas

Tačiau atminkite, kad jei pirmuosius penkis skaičius pašalinsime į nulį, skirtumas bus akivaizdus.

Kaip veikia JPEG formatas

Pradžioje esantys skaičiai rodo žemo dažnio vaizdo pokyčius, kuriuos mūsų akys geriausiai suvokia. Skaičiai, esantys pabaigoje, rodo aukštų dažnių pokyčius, kuriuos sunkiau pastebėti. Norėdami „pamatyti tai, ko akis nemato“, galime išskirti šias aukšto dažnio detales, pašalindami pirmuosius 5000 skaičių.

Kaip veikia JPEG formatas

Matome visas vaizdo sritis, kuriose vyksta didžiausias pokytis nuo pikselio iki pikselio. Išryškėja katės akys, jo ūsai, kilpinė antklodė ir šešėliai apatiniame kairiajame kampe. Galite eiti toliau, pašalindami pirmuosius 10 000 skaičių:

Kaip veikia JPEG formatas

20 m. 000 m.

Kaip veikia JPEG formatas

40 m. 000 m.

Kaip veikia JPEG formatas

60 m. 000 m.

Kaip veikia JPEG formatas

Šios aukšto dažnio detalės JPEG pašalinamos glaudinimo etape. Konvertuojant spalvas į DCT koeficientus, nėra jokių nuostolių. Praradimas atsiranda mėginių ėmimo etape, kai pašalinamos aukšto dažnio arba beveik nulinės vertės. Kai sumažinate JPEG įrašymo kokybę, programa padidina pašalintų reikšmių skaičiaus slenkstį, o tai sumažina failo dydį, tačiau vaizdą padaro pikseliais. Štai kodėl vaizdas pirmoje dalyje, kuris buvo 57 kartus mažesnis, atrodė taip. Kiekvienas 8x8 blokas buvo atstovaujamas daug mažiau DCT koeficientų, palyginti su aukštesnės kokybės versija.

Galite sukurti tokį puikų efektą kaip laipsniškas vaizdų srautinis perdavimas. Galite rodyti neryškų vaizdą, kuris tampa vis išsamesnis, kai atsisiunčiama vis daugiau koeficientų.

Čia, tik dėl malonumo, tai, ką gaunate naudodami tik 24 000 skaičių:

Kaip veikia JPEG formatas

Arba tik 5000:

Kaip veikia JPEG formatas

Labai neryškus, bet kažkaip atpažįstamas!

3. Vykdykite ilgio kodavimą, delta ir Huffman

Iki šiol visi suspaudimo etapai buvo nuostolingi. Paskutinis etapas, priešingai, vyksta be nuostolių. Tai neištrina informacijos, tačiau žymiai sumažina failo dydį.

Kaip galima ką nors suspausti neišmetant informacijos? Įsivaizduokite, kaip apibūdintume paprastą juodą 700 x 437 stačiakampį.

JPEG tam naudoja 5000 skaičių, tačiau galima pasiekti daug geresnių rezultatų. Ar galite įsivaizduoti kodavimo schemą, kuri tokį vaizdą apibūdintų kuo mažiau baitų?

Minimali schema, kurią galėčiau sugalvoti, naudoja keturis: tris vaizduoja spalvą, o ketvirtą nurodo, kiek ta spalva turi pikselių. Idėja reprezentuoti pasikartojančias reikšmes tokiu kondensuotu būdu vadinama run-length kodavimu. Tai be nuostolių, nes galime atkurti užkoduotus duomenis į pradinę formą.

JPEG failas su juodu stačiakampiu yra daug didesnis nei 4 baitai – atminkite, kad DCT lygiu glaudinimas taikomas 8x8 pikselių blokams. Todėl mums reikia bent vieno DCT koeficiento kiekvienam 64 pikseliams. Mums reikia vieno, nes užuot saugoję vieną DCT koeficientą, po kurio seka 63 nuliai, paleidimo ilgio kodavimas leidžia išsaugoti vieną skaičių ir nurodyti, kad „visi kiti yra nuliai“.

Delta kodavimas yra metodas, kai kiekvienas baitas turi skirtumą nuo tam tikros vertės, o ne absoliučią reikšmę. Todėl redaguojant tam tikrus baitus pakeičiama visų kitų pikselių spalva. Pavyzdžiui, vietoj saugojimo

12 13 14 14 14 13 13 14

Galime pradėti nuo 12 ir tada tiesiog nurodyti, kiek reikia pridėti arba atimti, kad gautume kitą skaičių. Ir ši delta kodavimo seka yra tokia:

12 1 1 0 0 -1 0 1

Konvertuoti duomenys nėra mažesni už pradinius duomenis, tačiau juos lengviau suspausti. Delta kodavimo taikymas prieš koduojant paleidimo trukmę gali labai padėti, o glaudinimas išlieka be nuostolių.

Delta kodavimas yra vienas iš nedaugelio metodų, naudojamų už 8x8 blokų ribų. Iš 64 DCT koeficientų vienas yra tiesiog pastovios bangos funkcija (vienspalvė). Tai rodo vidutinį kiekvieno bloko ryškumą luma komponentams arba vidutinį mėlynumą Cb komponentams ir pan. Pirmoji kiekvieno DCT bloko reikšmė vadinama DC reikšme, o kiekviena nuolatinės srovės vertė yra užkoduota delta, palyginti su ankstesnėmis. Todėl pirmojo bloko ryškumo pakeitimas turės įtakos visiems blokams.

Išlieka paskutinė paslaptis: kaip vienaskaitos pakeitimas visiškai sugadina visą vaizdą? Iki šiol suspaudimo lygiai tokių savybių neturėjo. Atsakymas slypi JPEG antraštėje. Pirmuosiuose 500 baitų yra metaduomenys apie vaizdą – plotis, aukštis ir pan., ir mes su jais dar nedirbome.

Be antraštės beveik neįmanoma (arba labai sunku) iššifruoti JPEG. Atrodys taip, lyg bandyčiau apibūdinti jums paveikslą ir pradedu sugalvoti žodžius, kad galėčiau perteikti savo įspūdį. Aprašymas tikriausiai bus gana trumpas, nes aš galiu sugalvoti žodžius, turinčius būtent tokią reikšmę, kurią noriu perteikti, bet visiems kitiems jie neturės prasmės.

Skamba kvailai, bet nutinka būtent taip. Kiekvienas JPEG vaizdas yra suglaudintas naudojant jam būdingus kodus. Kodų žodynas saugomas antraštėje. Ši technika vadinama Huffman kodu, o žodynas vadinamas Huffman lentele. Antraštėje lentelė pažymėta dviem baitais – 255 ir po to 196. Kiekvienas spalvos komponentas gali turėti savo lentelę.

Lentelių pakeitimai radikaliai paveiks bet kokį vaizdą. Geras pavyzdys yra pakeisti 15 eilutę į 1.

Kaip veikia JPEG formatas

Taip nutinka todėl, kad lentelėse nurodoma, kaip turi būti nuskaitomi atskiri bitai. Iki šiol dirbome tik su dvejetainiais skaičiais dešimtaine forma. Bet tai slepia nuo mūsų faktą, kad jei norite baite išsaugoti skaičių 1, jis atrodys kaip 00000001, nes kiekvienas baitas turi turėti tiksliai aštuonis bitus, net jei reikia tik vieno iš jų.

Tai gali būti didelis vietos švaistymas, jei turite daug mažų skaičių. Huffmano kodas yra metodas, leidžiantis sušvelninti šį reikalavimą, kad kiekvienas skaičius turi užimti aštuonis bitus. Tai reiškia, kad jei matote du baitus:

234 115

Tada, priklausomai nuo Huffman lentelės, tai gali būti trys skaičiai. Norėdami juos išgauti, pirmiausia turite suskirstyti į atskirus bitus:

11101010 01110011

Tada žiūrime į lentelę, kad išsiaiškintume, kaip juos sugrupuoti. Pavyzdžiui, tai gali būti pirmieji šeši bitai (111010) arba 58 dešimtainiai, po to penki bitai (10011) arba 19 ir galiausiai paskutiniai keturi bitai (0011) arba 3.

Todėl šiame glaudinimo etape labai sunku suprasti baitus. Baitai neatspindi to, kas atrodo. Šiame straipsnyje nesigilinsiu į darbo su lentele detales, bet medžiagos šiuo klausimu internete pakanka.

Vienas įdomus triukas, kurį galite padaryti su šiomis žiniomis, yra atskirti antraštę nuo JPEG ir saugoti ją atskirai. Tiesą sakant, pasirodo, kad tik jūs galite skaityti failą. „Facebook“ tai daro, kad failai būtų dar mažesni.

Ką dar galima padaryti, tai šiek tiek pakeisti Huffman lentelę. Kitiems tai atrodys kaip sugedęs paveikslas. Ir tik jūs žinosite stebuklingą būdą tai išspręsti.

Apibendrinkime: taigi ko reikia norint iššifruoti JPEG? Būtina:

  1. Ištraukite Huffman lentelę (-es) iš antraštės ir iššifruokite bitus.
  2. Išskleiskite kiekvienos spalvos ir skaisčio komponento atskiruosius kosinuso transformacijos koeficientus kiekvienam 8x8 blokui, atlikdami atvirkštines eigos ilgio ir delta kodavimo transformacijas.
  3. Sujunkite kosinusus pagal koeficientus, kad gautumėte pikselių reikšmes kiekvienam 8x8 blokui.
  4. Pakeiskite spalvų komponentus, jei buvo atlikta subimtinė (ši informacija yra antraštėje).
  5. Konvertuokite gautas kiekvieno pikselio YCbCr reikšmes į RGB.
  6. Rodyti vaizdą ekrane!

Rimtas darbas tiesiog žiūrint nuotrauką su kate! Tačiau man jame patinka tai, kad ji parodo, kokia JPEG technologija yra orientuota į žmogų. Jis pagrįstas mūsų suvokimo ypatumais, leidžiančiais pasiekti daug geresnį suspaudimą nei įprastos technologijos. Ir dabar, kai suprantame, kaip veikia JPEG, galime įsivaizduoti, kaip šias technologijas galima perkelti į kitas sritis. Pavyzdžiui, delta kodavimas vaizdo įraše gali žymiai sumažinti failo dydį, nes dažnai yra ištisos sritys, kurios nesikeičia nuo vieno kadro iki kito (pavyzdžiui, fonas).

Straipsnyje naudojamas kodas, yra atidarytas ir jame yra instrukcijos, kaip paveikslėlius pakeisti savomis.

Šaltinis: www.habr.com

Добавить комментарий