Kuidas JPEG-vorming töötab

JPEG-pildid on meie digielus üldlevinud, kuid selle teadlikkuse katte taga on peidus algoritmid, mis eemaldavad detailid, mida inimsilm ei näe. Tulemuseks on kõrgeim visuaalne kvaliteet väikseima failisuurusega – aga kuidas see kõik täpselt töötab? Vaatame, mida täpselt meie silmad ei näe!

Kuidas JPEG-vorming töötab

Võimalus saata sõbrale foto ja mitte muretseda selle pärast, millist seadet, brauserit või operatsioonisüsteemi ta kasutab, on lihtne pidada enesestmõistetavaks – kuid see ei olnud alati nii. 1980. aastate alguseks suutsid arvutid salvestada ja kuvada digitaalseid pilte, kuid selle parima viisi kohta oli palju konkureerivaid ideid. Sa ei saa lihtsalt pilti ühest arvutist teise saata ja loota, et see töötab.

Selle probleemi lahendamiseks moodustati 1986. aastal kogu maailmast ekspertide komitee nime all "Fotograafiaekspertide ühine rühm” (Joint Photographic Experts Group, JPEG), mis asutati Genfis (Šveitsis) peakorteriga kahe rahvusvahelise standardiorganisatsiooni Rahvusvahelise Standardiorganisatsiooni (ISO) ja Rahvusvahelise Elektrotehnikakomisjoni (IEC) ühise töö raames.

Rühm inimesi nimega JPEG lõi 1992. aastal JPEG digitaalse kujutise tihendamise standardi. Kõik, kes on internetti kasutanud, on ilmselt kohanud JPEG-kodeeringuga pilte. See on kõige levinum viis piltide kodeerimiseks, saatmiseks ja salvestamiseks. Veebilehtedest e-kirjadeni ja sotsiaalmeediani kasutatakse JPEG-e miljardeid kordi päevas – peaaegu iga kord, kui me pilti veebis vaatame või saadame. Ilma JPEG-failideta oleks veeb vähem hele, aeglasem ja tõenäoliselt oleks vähem kassipilte!

See artikkel räägib JPEG-kujutise dekodeerimisest. Teisisõnu selle kohta, mida on vaja arvutisse salvestatud tihendatud andmete teisendamiseks ekraanile ilmuvaks pildiks. Seda tasub teada mitte ainult seetõttu, et see on oluline igapäevaselt kasutatava tehnoloogia mõistmiseks, vaid ka seetõttu, et avaldades tihendustasemed, tunneme paremini taju ja nägemist ning ka seda, millised detailid on meie silmad kõige olulisemad. suhtes tundlik.

Pealegi on niimoodi piltidega väga huvitav mängida.

Kuidas JPEG-vorming töötab

JPEG-vormingusse vaadates

Arvutis on kõik salvestatud kahendarvude jadana. Tavaliselt on need bitid, nullid ja ühed, rühmitatud kaheksaks, moodustades baite. Kui avate arvutis JPEG-pildi, peab miski (brauser, operatsioonisüsteem, mis iganes) baite dekodeerima, taastades algse pildi kuvatavate värvide loendina.

Kui laadite selle armsa alla foto kassist ja avage see tekstiredaktoris, näete hulga segamini tegelasi.

Kuidas JPEG-vorming töötab
Siin kasutan faili sisu kontrollimiseks rakendust Notepad++, sest tavalised tekstiredaktorid, nagu Windowsi Notepad, ajavad binaarfaili pärast salvestamist sassi ja see ei sobi JPEG-vormingusse.

Pildi avamine tekstiredaktoris ajab teie arvuti segadusse, täpselt nagu aju segadusse, kui hõõrute silmi ja hakkate nägema värvilisi laike!

Neid kohti, mida näete, nimetatakse fosfeenid, ja need ei tulene kokkupuutest kerge stiimuliga ega meele tekitatud hallutsinatsioonidega. Need tekivad seetõttu, et teie aju arvab, et kõik nägemisnärvide elektrilised signaalid kannavad teavet valguse kohta. Aju peab selliseid oletusi tegema, sest ei saa kuidagi teada, kas signaal on heli, nägemus või midagi muud. Kõik keha närvid edastavad täpselt samu elektriimpulsse. Kui avaldate silmadele survet, saadate signaale, mis ei ole visuaalsed, vaid aktiveerivad silmas olevaid retseptoreid, mida teie aju tõlgendab – antud juhul valesti – kui midagi visuaalset. Näete sõna otseses mõttes survet!

Naljakas on mõelda sellele, kui sarnased arvutid on ajuga, kuid see on ka kasulik analoogia, mis illustreerib, kui palju andmete tähendus – olgu need siis närvide kaudu läbi keha kantud või arvutisse salvestatud – sõltub sellest, kuidas neid tõlgendatakse. Kõik binaarandmed koosnevad XNUMX-dest ja XNUMX-dest, mis on põhikomponendid, mis on võimelised edastama igasugust teavet. Teie arvuti arvab sageli ära, kuidas neid vihjete, näiteks faililaiendite abil tõlgendada. Nüüd paneme need tõlgendama tekstina, sest seda tekstiredaktor ootab.

Et mõista, kuidas JPEG-d dekodeerida, peame nägema algseid signaale ise - binaarandmeid. Seda saab teha hex-redaktoriga või otse algse artikli veebileht! Seal on pilt, mille kõrval tekstiväljal esitatakse kõik selle baidid (v.a päis) kümnendkujul. Saate neid muuta ja skript kodeerib ümber ja loob käigu pealt uue pildi.

Kuidas JPEG-vorming töötab

Selle redaktoriga mängides saate palju õppida. Näiteks, kas saate öelda, mis järjekorras piksleid salvestatakse?

Antud näite puhul on kummaline see, et mõne numbri muutmine ei mõjuta pilti üldse ja näiteks kui asendada number 17 esimeses reas 0-ga, siis läheb foto täiesti rikutuks!

Kuidas JPEG-vorming töötab

Muud muudatused, näiteks 7 muutmine real 1988 vastu 254, muudavad värvi, kuid ainult järgnevaid piksleid.

Kuidas JPEG-vorming töötab

Võib-olla on kõige kummalisem see, et mõned numbrid muudavad mitte ainult pildi värvi, vaid ka kuju. Muutke 70 real 12 vastu 2 ja vaadake pildi ülemist rida, et näha, mida ma mõtlen.

Kuidas JPEG-vorming töötab

Ja olenemata sellest, millist JPEG-pilti te kasutate, leiate baitide redigeerimisel alati need salapärased malemustrid.

Redigeerijaga mängides on raske aru saada, kuidas nendest baitidest fotot uuesti luua, kuna JPEG-tihendus koosneb kolmest erinevast tehnoloogiast, mida rakendatakse järjestikku tasemetel. Uurime neid kõiki eraldi, et paljastada meie jälgitav salapärane käitumine.

Kolm JPEG-tihendamise taset:

  1. Värvi alamproovide võtmine.
  2. Diskreetne koosinuse teisendus ja diskretiseerimine.
  3. Jooksu pikkuse kodeerimine, delta и huffman

Et anda teile aimu tihendamise ulatusest, pange tähele, et ülaltoodud pilt kujutab 79 819 numbrit, mis on umbes 79 KB. Kui salvestaksime selle ilma tihendamata, vajaksime iga piksli kohta kolme numbrit – punase, rohelise ja sinise komponendi jaoks. See oleks 917 700 numbrit ehk ca. 917 Kb. JPEG tihendamise tulemusena on lõplik fail vähenenud üle 10 korra!

Tegelikult saab seda pilti palju rohkem tihendada. All on kaks pilti kõrvuti – parempoolne foto oli tihendatud 16 KB-ni ehk 57 korda vähem kui tihendamata versioon!

Kuidas JPEG-vorming töötab

Kui vaatate tähelepanelikult, näete, et need pildid ei ole identsed. Mõlemad on JPEG-tihendusega pildid, kuid parempoolne on mahult palju väiksem. See näeb ka veidi halvem välja (vaadake taustavärvi ruute). Seetõttu nimetatakse JPEG-d ka kadudega tihendamiseks; tihendusprotsessi käigus pilt muutub ja kaob osa detaile.

1. Värvi alamproovide võtmine

Siin on pilt, millel on rakendatud ainult esimene tihendusaste.

Kuidas JPEG-vorming töötab
(Interaktiivne versioon sisse originaal artiklid). Ühe numbri eemaldamine hävitab kõik värvid. Kui aga eemaldada täpselt kuus numbrit, ei mõjuta see pilti peaaegu üldse.

Nüüd on numbreid veidi lihtsam dešifreerida. See on peaaegu lihtne värvide loetelu, iga bait muudab täpselt ühe piksli, kuid see on juba poole väiksem kui tihendamata pilt (milleks kuluks sellisel vähendatud suurusel ca 300 KB). Arvake ära, miks?

Näete, et need numbrid ei esinda standardset punast, rohelist ja sinist komponenti, sest kui asendame kõik numbrid nullidega, saame rohelise pildi (mitte valge).

Kuidas JPEG-vorming töötab

Seda seetõttu, et need baidid tähistavad Y (heledus),

Kuidas JPEG-vorming töötab

Cb (suhteline sinine),

Kuidas JPEG-vorming töötab

ja Cr (suhteline punetus) pildid.

Kuidas JPEG-vorming töötab

Miks mitte kasutada RGB-d? Lõppude lõpuks töötab enamik kaasaegseid ekraane nii. Teie monitor suudab kuvada iga piksli jaoks erineva intensiivsusega mis tahes värvi, sealhulgas punast, rohelist ja sinist. Valge saadakse, lülitades kõik kolm täis heledusega sisse, ja must lülitab need välja.

Kuidas JPEG-vorming töötab

Samuti on see väga sarnane inimese silma tööga. Meie silmade värviretseptoreid nimetatakse "koonused“, ja jagunevad kolme tüüpi, millest igaüks on tundlikum kas punase või rohelise või sinise värvi suhtes [S-tüüpi koonused on tundlikud violetse-sinise värviga (S inglise keelest. Short - short-wavelength spectrum), M-tüüpi - roheline-kollane (M inglise keelest Medium -. Keskmine laine) ja L-tüüpi - kollane-punane (L inglise keelest. Long - pikalaineline) spektri osad. Nende kolme tüüpi koonuste (ja spektri smaragdrohelises osas tundlikud vardad) olemasolu annab inimesele värvinägemise. / ca. tõlge]. Sticks, teist tüüpi fotoretseptor meie silmades, suudab tuvastada muutusi heleduses, kuid on värvi suhtes palju tundlikum. Meie silmades on umbes 120 miljonit varrast ja ainult 6 miljonit koonust.

Seetõttu märkavad meie silmad heleduse muutusi palju paremini kui värvimuutusi. Kui eraldate värvi heledusest, saate natuke värvi eemaldada ja keegi ei märka midagi. Chroma subsampling on protsess, mille käigus esitatakse kujutise värvikomponendid madalama eraldusvõimega kui heleduse komponendid. Ülaltoodud näites on igal pikslil täpselt üks Y-komponent ja igal neljast pikslist koosneval rühmal on täpselt üks Cb- ja üks Cr-komponent. Seetõttu sisaldab pilt neli korda vähem värviinfot kui originaal.

YCbCr värviruumi ei kasutata ainult JPEG-failides. Algselt leiutati see 1938. aastal telesaadete jaoks. Kõigil pole värvitelerit, nii et värvide ja heleduse eraldamine võimaldas kõigil saada sama signaali ning ilma värvita telerid kasutasid ainult heleduse komponenti.

Seetõttu hävitab ühe numbri eemaldamine redaktorist täielikult kõik värvid. Komponendid salvestatakse kujul YYYY Cb Cr (tegelikult mitte ilmtingimata sellises järjekorras - salvestusjärjestus on määratud faili päises). Esimese numbri eemaldamisel tajutakse Cb esimest väärtust Y-na, Cr-d Cb-na ja üldiselt saadakse doominoefekt, mis muudab kõik pildi värvid.

JPEG-spetsifikatsioon ei nõua YCbCr kasutamist. Kuid enamik faile kasutab seda, kuna see annab RGB-ga võrreldes parema kvaliteediga pildid pärast allavõtmist. Aga sa ei pea minu sõna järgi pidama. Vaadake allolevast tabelist ise, kuidas näeks välja iga üksiku komponendi alamdiskreetmine nii RGB kui ka YCbCr puhul.

Kuidas JPEG-vorming töötab
(Interaktiivne versioon sisse originaal artiklid).

Sinise eemaldamine ei ole nii märgatav kui punane või roheline. Seda seetõttu, et teie silmades on kuus miljonit koonust, umbes 64% on tundlikud punase, 32% rohelise ja 2% sinise suhtes.

Y-komponendi alamdiskreetimine (all vasakul) on kõige paremini nähtav. Isegi väike muutus on märgatav.

Pildi teisendamine RGB-vormingust YCbCr-vormingusse ei vähenda faili suurust, küll aga hõlbustab vähem märgatavate detailide leidmist, mida saab eemaldada. Teises etapis toimub kadudega kokkusurumine. See põhineb ideel esitada andmed tihendatavamal kujul.

2. Diskreetne koosinuse teisendus ja diskretiseerimine

See tihendamise tase määrab enamasti JPEG olemuse. Pärast värvide teisendamist YCbCr-ks tihendatakse komponendid ükshaaval, seega saame edaspidi keskenduda vaid Y-komponendile.Ja siin on näha, millised näevad Y-komponendi baidid välja pärast selle taseme rakendamist.

Kuidas JPEG-vorming töötab
(Interaktiivne versioon sisse originaal artiklid). Interaktiivses versioonis liigub pikslil klõpsamine redaktori reale, mis seda tähistab. Proovige numbrid lõpust eemaldada või lisada teatud arvule paar nulli.

Esmapilgul tundub see väga halb kokkusurumine. Pildil on 100 000 pikslit ja nende heleduse (Y-komponendid) näitamiseks kulub 102 400 numbrit – see on hullem kui mitte midagi kokku suruda!

Kuid pange tähele, et enamik neist numbritest on null. Pealegi saab kõik need nullid ridade lõpust eemaldada ilma pilti muutmata. Jäänud on umbes 26 000 numbrit, mis on peaaegu 4 korda vähem!

See tase sisaldab malemustrite saladust. Erinevalt teistest efektidest, mida oleme näinud, ei ole nende mustrite välimus tõrge. Need on kogu pildi ehituskivid. Iga redaktori rida sisaldab täpselt 64 numbrit, diskreetse koosinusteisenduste (DCT) koefitsiente, mis vastavad 64 unikaalse mustri intensiivsusele.

Need mustrid moodustatakse koosinusgraafiku põhjal. Mõned neist näevad välja järgmised:

Kuidas JPEG-vorming töötab
8 koefitsient 64-st

Allpool on pilt, mis näitab kõiki 64 mustrit.

Kuidas JPEG-vorming töötab
(Interaktiivne versioon sisse originaal artiklid).

Need mustrid on eriti olulised, kuna need on 8x8 kujutiste aluseks. Kui te pole lineaarse algebraga tuttav, tähendab see, et nendest 8 mustrist on võimalik saada mis tahes 8x64 kujutist. DCT on piltide jagamine 8x8 plokkideks ja iga ploki teisendamine nende 64 koefitsiendi kombinatsiooniks.

Asjaolu, et mis tahes kujutist saab koostada 64 konkreetsest mustrist, tundub maagia. See on aga sama, mis öelda, et mis tahes kohta Maal saab kirjeldada kahe numbriga – laius- ja pikkuskraad [näitab poolkerasid / u. tõlge]. Me arvame sageli, et Maa pind on kahemõõtmeline, seega vajame ainult kahte arvu. 8x8 pildil on 64 mõõdet, seega vajame 64 numbrit.

Pole veel selge, kuidas see meid tihendamisel aitab. Kui vajame 64x8 kujutise esitamiseks 8 numbrit, siis miks oleks see parem kui lihtsalt 64 heleduse komponendi salvestamine? Teeme seda samal põhjusel, kui muutsime kolm RGB-numbrit kolmeks YCbCr-numbriks: see võimaldab meil eemaldada peeneid detaile.

Praeguses etapis on raske täpselt näha, milliseid detaile eemaldatakse, sest JPEG rakendab DCT-d 8x8 plokkidele. Kuid keegi ei keela meil seda tervikpildile rakendada. Kogu pildile rakendades näeb DCT Y-komponendi jaoks välja järgmine:

Kuidas JPEG-vorming töötab

Otsast saab eemaldada enam kui 60 000 numbrit praktiliselt ilma märgatavate muudatusteta fotol.

Kuidas JPEG-vorming töötab

Pange tähele, et kui nullida esimesed viis numbrit, on erinevus ilmne.

Kuidas JPEG-vorming töötab

Alguses olevad numbrid tähistavad pildi madala sagedusega muutusi ja meie silmad tajuvad neid kõige paremini. Numbrid lõpus näitavad kõrgsageduslikke muutusi, mida on raskem märgata. Et "näha seda, mida silm ei näe", saame need kõrgsageduslikud detailid eraldada, nullides esimesed 5000 numbrit.

Kuidas JPEG-vorming töötab

Näeme kõiki pildi piirkondi, kus pikslist pikslisse toimub suurim muutus. Silma paistavad kassi silmad, vurrud, froteetekk ja varjud vasakus alanurgas. Võite minna kaugemale, nullides esimesed 10 000 numbrit:

Kuidas JPEG-vorming töötab

20 000 XNUMX:

Kuidas JPEG-vorming töötab

40 000 XNUMX:

Kuidas JPEG-vorming töötab

60 000 XNUMX:

Kuidas JPEG-vorming töötab

Need kõrgsageduslikud detailid eemaldatakse JPEG-ga tihendamisetapis. Värvide teisendamine DCT koefitsientideks on kadudeta. Kaod moodustuvad proovivõtu etapis, kus eemaldatakse kõrge sagedusega või nullilähedased väärtused. Kui alandate JPEG-salvestuse kvaliteeti, suurendab programm eemaldatavate väärtuste arvu künnist, mis vähendab faili suurust, kuid muudab pildi pikslilisemaks. Nii et esimese jaotise pilt, mis oli 57 korda väiksem, nägi välja selline. Iga 8x8 plokk esindas palju väiksemat arvu DCT koefitsiente võrreldes kvaliteetsema versiooniga.

Saate teha midagi nii lahedat nagu piltide järkjärguline voogesitamine. Saate kuvada uduse pildi, mis muutub koefitsientide allalaadimisel üha üksikasjalikumaks.

Siin, naljaks, mis juhtub, kui kasutada ainult 24 000 numbrit:

Kuidas JPEG-vorming töötab

Või lihtsalt 5000:

Kuidas JPEG-vorming töötab

Väga udune, aga äratuntav!

3. Jooksu pikkuste, delta ja Huffmani kodeerimine

Siiani on kõik tihendamise etapid olnud kadudeta. Viimane etapp, vastupidi, läheb ilma kaotuseta. See ei eemalda teavet, kuid vähendab oluliselt faili suurust.

Kuidas saab midagi tihendada ilma teavet kõrvale heitmata? Kujutage ette, kuidas me kirjeldaksime lihtsat musta 700 x 437 ristkülikut.

JPEG kasutab selleks 5000 numbrit, kuid palju paremaid tulemusi on võimalik saavutada. Kas te kujutate ette kodeerimisskeemi, mis kirjeldab sellist pilti võimalikult väheste baitidega?

Minimaalne skeem, mille võiksin välja mõelda, kasutab nelja: kolm värvi jaoks ja neljas selle värvi pikslite arvu jaoks. Ideed esitada korduvaid väärtusi sellisel tihendatud viisil nimetatakse run-length kodeerimiseks. See on kadudeta, kuna saame kodeeritud andmed taastada nende algsel kujul.

Musta ristkülikuga JPEG-faili suurus on palju suurem kui 4 baiti – pidage meeles, et DCT tasemel rakendatakse tihendamist 8x8 piksliga plokkidele. Seetõttu vajame vähemalt ühte DCT koefitsienti iga 64 piksli kohta. Meil on seda vaja, sest ühe DCT koefitsiendi ja sellele järgneva 63 nulli salvestamise asemel võimaldab run-length kodeering salvestada ühe arvu ja tähistada "kõik teised on nullid".

Delta kodeerimine on tehnika, mille puhul iga bait sisaldab absoluutväärtuse asemel erinevust mõnest väärtusest. Seetõttu muudab teatud baitide redigeerimine kõigi teiste pikslite värvi. Näiteks ladustamise asemel

12 13 14 14 14 13 13 14

Võiksime alustada 12-st ja siis lihtsalt kirjutada, kui palju lisada või lahutada, et saada järgmine arv. Ja see deltakodeerimise jada on järgmisel kujul:

12 1 1 0 0 -1 0 1

Teisendatud andmed ei ole algandmetest väiksemad, kuid neid on lihtsam tihendada. Delta-kodeeringu rakendamine enne run-length kodeeringut võib palju aidata, säilitades samal ajal kadudeta pakkimise.

Delta kodeerimine on üks väheseid tehnikaid, mida kasutatakse väljaspool 8x8 plokke. 64 DCT koefitsiendist on üks lihtsalt konstantne lainefunktsioon (ühtlane värv). See tähistab heleduse komponentide iga ploki keskmist heledust või Cb komponentide keskmist sinisust jne. Iga DCT ploki esimest väärtust nimetatakse alalisvoolu väärtuseks ja iga alalisvoolu väärtus on eelmiste väärtuste suhtes delta kodeeringus. Seetõttu mõjutab esimese ploki heleduse muutmine kõiki plokke.

Jääb alles viimane mõistatus: kuidas rikub ainsuse numbri muutmine kogu pildi täielikult? Seni ei olnud tihendustasemetel selliseid omadusi. Vastus peitub JPEG päises. Esimesed 500 baiti sisaldavad metaandmeid pildi kohta – laius, kõrgus jne ning siiani pole me nendega töötanud.

Ilma päiseta on JPEG-i dekodeerimine peaaegu võimatu (noh, väga raske). Näib, et ma üritan teile pilti kirjeldada ja hakkan oma mulje edastamiseks sõnu leiutama. Tõenäoliselt tuleb kirjeldus väga kokkuvõtlik, sest ma suudan välja mõelda täpselt sellise tähendusega sõnu, mida tahan edasi anda, aga kõigi teiste jaoks pole neil mõtet.

Kõlab rumalalt, aga nii see juhtub. Iga JPEG-pilt tihendatakse sellele spetsiifiliste koodidega. Koodisõnastik salvestatakse päisesse. Seda tehnikat nimetatakse "Huffmani koodiks" ja sõnaraamatut nimetatakse Huffmani tabeliks. Päises on tabel tähistatud kahe baidiga - 255 ja seejärel 196. Igal värvikomponendil võib olla oma tabel.

Tabelimuudatused mõjutavad drastiliselt mis tahes pilti. Hea näide on muuta 15. real 1 12-ks.

Kuidas JPEG-vorming töötab

Seda seetõttu, et tabelid määravad, kuidas üksikuid bitte lugeda. Seni oleme kahendarvudega töötanud ainult kümnendkoha kujul. Kuid see varjab meie eest tõsiasja, et kui soovite baiti salvestada numbri 1, siis näeb see välja nagu 00000001, sest igas baidis peab olema täpselt kaheksa bitti, isegi kui vaja on ainult ühte.

See võib olla suur ruumiraiskamine, kui teil on palju väikseid numbreid. Huffmani kood on tehnika, mis võimaldab meil leevendada seda nõuet, et iga number peab hõivama kaheksa bitti. See tähendab, et kui näete kahte baiti:

234 115

Siis, olenevalt Huffmani tabelist, võib see olla kolm numbrit. Nende eraldamiseks peate need esmalt jagama üksikuteks bittideks:

11101010 01110011

Seejärel pöördume tabeli poole, et mõista, kuidas neid rühmitada. Näiteks võib see olla esimesed kuus bitti (111010) või 58 kümnendkohana, millele järgneb viis bitti (10011) või 19 ja lõpuks neli viimast bitti (0011) või 3.

Seetõttu on selles tihendamise etapis baite väga raske mõista. Baidid ei esinda seda, mis nad paistavad. Ma ei lasku selles artiklis tabeliga töötamise üksikasjadesse, kuid materjalid sellel teemal Internetis piisavalt.

Üks lahedaid nippe, mida selle teadmisega teha saab, on päise JPEG-st eraldamine ja eraldi salvestamine. Tegelikult selgub, et faili saate lugeda ainult teie. Facebook teeb seda failide vähendamiseks.

Mida veel saab teha, on Huffmani tabelit üsna vähe muuta. Teiste jaoks näeb see välja nagu rikutud pilt. Ja ainult teie teate maagilist võimalust selle parandamiseks.

Kokkuvõtteks: mida on siis vaja JPEG-i dekodeerimiseks? Vajalik:

  1. Ekstraheerige päisest Huffmani tabel (tabelid) ja dekodeerige bitid.
  2. Ekstraheerige iga 8x8 ploki iga värvi ja heleduse komponendi diskreetsed koosinusteisenduskoefitsiendid, teisendades pöördvõrdeliselt jooksupikkuse kodeeringut ja deltat.
  3. Kombineerige koefitsientide põhjal koosinused, et saada iga 8x8 ploki piksliväärtused.
  4. Skaalake värvikomponente, kui teostati alamdiskreet (see teave on päises).
  5. Teisendage saadud YCbCr väärtused iga piksli jaoks RGB-ks.
  6. Tooge pilt ekraanile!

Tõsine töö kassiga foto vaatamiseks! Mulle meeldib selle juures aga see, et see näitab, kui inimkeskne JPEG-tehnoloogia on. See põhineb meie taju iseärasustel, mis võimaldab saavutada palju parema tihenduse kui tavatehnoloogiad. Ja nüüd, kui saate aru, kuidas JPEG töötab, võite ette kujutada, kuidas neid tehnoloogiaid muudesse piirkondadesse üle kanda. Näiteks võib deltakodeering videos kaasa tuua faili suuruse olulise vähenemise, kuna sageli on terveid alasid, mis ei muutu kaadrist kaadrisse (näiteks taust).

Artiklis kasutatud kood, on avatud ja sisaldab juhiseid piltide asendamiseks enda omadega.

Allikas: www.habr.com

Lisa kommentaar