Si funksionon formati JPEG

Imazhet në formatin JPEG gjenden kudo në jetën tonë digjitale, por pas kësaj familjariteti fshihen algoritme që heqin detaje të padallueshme për syrin e njeriut. Rezultati është cilësi vizuale shumë e lartë me madhësi minimale skedari – por si funksionon saktësisht e gjithë kjo? Le të shohim çfarë pikërisht nuk arrijnë të dallojnë sytë tanë!

Si funksionon formati JPEG

Është e lehtë ta marrim si të mirëqenë mundësinë për t’i dërguar një foto një miku pa u shqetësuar se çfarë pajisjeje, shfletuesi apo sistemi operativ përdor ai – por nuk ka qenë gjithmonë kështu. Në fillim të viteve 1980, kompjuterët dinin të ruanin dhe të shfaqnin imazhe digjitale, por kishte shumë ide konkurruese për mënyrën më të mirë për ta bërë këtë. Nuk mund të dërgoje thjesht një imazh nga një kompjuter te tjetri dhe të shpresoje se gjithçka do të funksiononte.

Për të zgjidhur këtë problem, në vitin 1986 u mblodh një komitet ekspertësh nga e gjithë bota me emrin «Grupi i përbashkët i ekspertëve fotografikë» (Joint Photographic Experts Group, JPEG), i krijuar në kuadër të bashkëpunimit mes Organizatës Ndërkombëtare për Standardizim (ISO) dhe Komisionit Ndërkombëtar Elektroteknik (IEC) – dy organizata ndërkombëtare të standardizimit me seli në Gjenevë, Zvicër.

Grupi i njohur si JPEG krijoi standardin JPEG për kompresimin e imazheve digjitale në vitin 1992. Kushdo që ka përdorur internetin ka shumë të ngjarë të ketë hasur imazhe të koduara në JPEG. Kjo është mënyra më e përhapur për kodimin, dërgimin dhe ruajtjen e imazheve. Nga faqet e internetit te emaili dhe rrjetet sociale, JPEG përdoret miliarda herë çdo ditë – pothuajse sa herë që shohim një imazh online ose e dërgojmë atë. Pa JPEG, uebi do të ishte më pak i gjallë, më i ngadaltë dhe, me shumë gjasë, do të kishte më pak foto macesh!

Ky artikull shpjegon si dekodohet një imazh JPEG. Me fjalë të tjera, çfarë nevojitet për t’i kthyer të dhënat e kompresuara, të ruajtura në kompjuter, në imazhin që shfaqet në ekran. Kjo ia vlen të dihet jo vetëm sepse është e rëndësishme për të kuptuar teknologjinë që përdorim çdo ditë, por edhe sepse, duke zbuluar shtresat e kompresimit, kuptojmë më mirë perceptimin dhe shikimin, si edhe se ndaj cilave detaje sytë tanë janë më të ndjeshëm.

Për më tepër, të eksperimentosh me imazhet në këtë mënyrë është shumë interesante.

Si funksionon formati JPEG

Një vështrim brenda JPEG

Në kompjuter, gjithçka ruhet si një varg numrash binarë. Zakonisht këta bite, zero dhe njësha, grupohen nga tetë për të formuar byte. Kur hapni një imazh JPEG në kompjuter, diçka (shfletuesi, sistemi operativ apo diçka tjetër) duhet t’i dekodojë byte-t, duke rikthyer imazhin fillestar si një listë ngjyrash që mund të shfaqen.

Nëse shkarkoni këtë foto të lezetshme të një maceje dhe e hapni në një redaktues teksti, do të shihni një mori simbolesh pa kuptim.

Si funksionon formati JPEG
Këtu po përdor Notepad++ për të shqyrtuar përmbajtjen e skedarit, sepse redaktuesit e zakonshëm të tekstit, si Notepad në Windows, do ta dëmtojnë skedarin binar pas ruajtjes dhe ai nuk do të përputhet më me formatin JPEG.

Kur hapni një imazh në një redaktues teksti, e ngatërroni kompjuterin, njësoj siç e ngatërroni trurin kur fërkoni sytë dhe filloni të shihni njolla me ngjyra!

Këto njolla që shihni njihen si fosfene, dhe nuk janë rezultat i një stimuli drite apo halucinacione të krijuara nga mendja. Ato shfaqen sepse truri juaj supozon se çdo sinjal elektrik në nervat e syrit bart informacion për dritën. Trurit i duhet të bëjë supozime të tilla, sepse nuk ka asnjë mënyrë për të ditur nëse një sinjal është tingull, pamje apo diçka tjetër. Të gjithë nervat në trup transmetojnë saktësisht të njëjtat impulse elektrike. Kur ushtroni presion mbi sytë, dërgoni sinjale që nuk janë vizuale, por që aktivizojnë receptorët e syrit, dhe truri juaj i interpreton — në këtë rast gabimisht — si diçka vizuale. Ju fjalë për fjalë mund ta shihni presionin!

Është interesante të mendosh sa shumë u ngjajnë kompjuterët trurit, por kjo është edhe një analogji e dobishme që tregon sa fort varet kuptimi i të dhënave — qoftë atyre që nervat transmetojnë nëpër trup, apo atyre që ruhen në kompjuter — nga mënyra si interpretohen. Të gjitha të dhënat binare përbëhen nga zero dhe njësi, elementët bazë që mund të përcjellin informacion të çdo lloji. Kompjuteri juaj shpesh e merr me mend si t’i interpretojë ato duke u bazuar në të dhëna ndihmëse, si p.sh. prapashtesat e skedarëve. Ndërsa tani po e detyrojmë t’i interpretojë si tekst, sepse pikërisht këtë pret një redaktues teksti.

Për të kuptuar si dekodohet një JPEG, duhet të shohim vetë sinjalet fillestare — të dhënat binare. Kjo mund të bëhet me ndihmën e një redaktuesi heksadecimal, ose drejtpërdrejt në faqen origjinale të artikullit! Aty ka një figurë, pranë së cilës në një fushë teksti paraqiten të gjithë bajtet e saj (përveç header-it), të shfaqur në format dhjetor. Mund t’i ndryshoni, dhe skripti do ta rikodojë e do të gjenerojë menjëherë një figurë të re.

Si funksionon formati JPEG

Mund të mësoni shumë thjesht duke luajtur me këtë redaktues. Për shembull, a mund të kuptoni në çfarë rendi ruhen pikselët?

Gjëja e çuditshme në këtë shembull është se ndryshimi i disa numrave nuk ndikon fare në figurë, ndërsa, për shembull, nëse zëvendësoni numrin 17 me 0 në rreshtin e parë, fotografia prishet plotësisht!

Si funksionon formati JPEG

Ndryshime të tjera, si p.sh. zëvendësimi i 7 në rreshtin 1988 me numrin 254, e ndryshojnë ngjyrën, por vetëm të pikselëve që vijnë më pas.

Si funksionon formati JPEG

Ndoshta më e çuditshmja është se disa numra ndryshojnë jo vetëm ngjyrën, por edhe formën e figurës. Ndryshoni 70 në rreshtin 12 me 2 dhe shikoni rreshtin e sipërm të figurës për të parë çfarë dua të them.

Si funksionon formati JPEG

Dhe pavarësisht se cilën figurë JPEG përdorni, gjatë redaktimit të bajteve do të hasni gjithmonë këto sekuenca misterioze si tabelë shahu.

Duke luajtur me redaktuesin, është e vështirë të kuptosh si rindërtohet fotografia nga këta bajte, sepse kompresimi JPEG përbëhet nga tre teknologji të ndryshme që zbatohen njëra pas tjetrës në nivele të ndryshme. Do ta shqyrtojmë secilën veçmas për të shpjeguar këtë sjellje të çuditshme që po vërejmë.

Tri nivelet e kompresimit JPEG:

  1. Nënmostrimi i ngjyrave.
  2. Transformimi kosinusor diskret dhe kuantizimi.
  3. Kodimi i gjatësisë së serive, delta dhe Huffman

Që të mund ta përfytyroni shkallën e kompresimit, vini re se imazhi i paraqitur më sipër përbëhet nga 79 819 numra, pra rreth 79 KB. Po ta ruanim pa kompresim, për çdo piksel do të duheshin nga tre numra – për përbërësin e kuq, të gjelbër dhe blu. Kjo do të thoshte 917 700 numra, ose rreth 917 KB. Si rezultat i kompresimit JPEG, skedari përfundimtar u zvogëlua më shumë se 10 herë!

Në fakt, ky imazh mund të kompresohet edhe shumë më fort. Më poshtë janë paraqitur dy imazhe krah për krah – fotografia në të djathtë është ngjeshur deri në 16 KB, pra 57 herë më e vogël se versioni i pakompresuar!

Si funksionon formati JPEG

Nëse e shikoni me kujdes, do të vini re se këto imazhe nuk janë identike. Të dyja janë figura me kompresim JPEG, por ajo në të djathtë është shumë më e vogël në madhësi. Ajo gjithashtu duket pak më keq (shikoni katrorët e ngjyrave të sfondit). Prandaj JPEG quhet edhe kompresim me humbje; gjatë procesit të kompresimit, imazhi ndryshon dhe humbet disa detaje.

1. Nënmostrimi i ngjyrave

Ja imazhi me të aplikuar vetëm nivelin e parë të kompresimit.

Si funksionon formati JPEG
(Versioni interaktiv – në origjinalin e artikullit). Heqja e një numri prish të gjitha ngjyrat. Megjithatë, nëse hiqen saktësisht gjashtë numra, kjo praktikisht nuk ndikon në imazh.

Tani numrat janë pak më të lehtë për t’u deshifruar. Është pothuajse një listë e thjeshtë ngjyrash, ku çdo bajt ndryshon saktësisht një piksel, por megjithatë tashmë është dy herë më e vogël se imazhi i pakompresuar (i cili do të zinte rreth 300 KB në këtë madhësi të zvogëluar). A e merrni me mend pse?

Mund të shihet se këta numra nuk përfaqësojnë përbërësit standardë të kuq, të gjelbër dhe blu, sepse nëse i zëvendësojmë të gjithë numrat me zero, do të marrim një imazh të gjelbër (dhe jo të bardhë).

Si funksionon formati JPEG

Kjo ndodh sepse këta bajte përfaqësojnë Y (ndriçimi),

Si funksionon formati JPEG

Cb (shkalla relative e blusë),

Si funksionon formati JPEG

dhe Cr (shkalla relative e së kuqes) të figurës.

Si funksionon formati JPEG

Pse të mos përdoret RGB? Në fund të fundit, pikërisht kështu funksionon shumica e ekraneve moderne. Monitori juaj mund të shfaqë çdo ngjyrë, duke përfshirë të kuqen, të gjelbrën dhe blunë me intensitet të ndryshëm për çdo piksel. E bardha merret duke i aktivizuar të tria me ndriçim maksimal, ndërsa e zeza duke i fikur ato.

Si funksionon formati JPEG

Kjo është gjithashtu shumë e ngjashme me mënyrën si funksionon syri i njeriut. Receptorët e ngjyrave në sytë tanë quhen “kone«, dhe ndahen në tre lloje, secili prej të cilëve është më i ndjeshëm ose ndaj ngjyrës së kuqe, ose ndaj së gjelbrës, ose ndaj së kaltërës [kolbat e tipit S janë të ndjeshme në pjesën vjollcë-blu të spektrit (S nga anglishtja Short — spektër me gjatësi vale të shkurtër), të tipit M — në pjesën jeshile-të verdhë (M nga anglishtja Medium — me gjatësi vale të mesme), dhe të tipit L — në pjesën e verdhë-të kuqe (L nga anglishtja Long — me gjatësi vale të gjatë) të spektrit. Prania e këtyre tre llojeve të kolbave (dhe e shkopinjve, të ndjeshëm në pjesën smerald-jeshile të spektrit) i jep njeriut shikim me ngjyra. \/ shën. e përkth.]. Shkopinjtë, lloji tjetër i fotoreceptorëve në sytë tanë, mund të perceptojnë ndryshimet në ndriçim, por janë shumë më pak të ndjeshëm ndaj ngjyrës. Në sytë tanë ka rreth 120 milionë shkopinj dhe vetëm 6 milionë kolba.

Prandaj sytë tanë i vërejnë shumë më mirë ndryshimet në ndriçim sesa ndryshimet në ngjyrë. Nëse ngjyra ndahet nga ndriçimi, mund të hiqet pak nga ngjyra dhe askush nuk do ta vërë re. Nënkampionimi i ngjyrës është procesi i paraqitjes së përbërësve të ngjyrës së imazhit me rezolucion më të ulët krahasuar me përbërësit e ndriçimit. Në shembullin e mësipërm, çdo piksel ka saktësisht një përbërës Y, ndërsa çdo grup i veçantë prej katër pikselësh ka saktësisht një përbërës Cb dhe një Cr. Prandaj imazhi përmban katër herë më pak informacion ngjyrash sesa origjinali.

Hapësira e ngjyrave YCbCr nuk përdoret vetëm në JPEG. Ajo u krijua fillimisht në vitin 1938 për transmetimet televizive. Jo të gjithë kishin televizor me ngjyra, ndaj ndarja e ngjyrës nga ndriçimi bëri të mundur që të gjithë të merrnin të njëjtin sinjal, ndërsa televizorët pa ngjyra përdornin thjesht vetëm përbërësin e ndriçimit.

Prandaj heqja e një numri nga redaktori i prish plotësisht të gjitha ngjyrat. Përbërësit ruhen në formën Y Y Y Y Cb Cr (në fakt, jo domosdoshmërisht në këtë renditje — renditja e ruajtjes përcaktohet në kokën e skedarit). Heqja e numrit të parë do të bëjë që vlera e parë Cb të interpretohet si Y, Cr si Cb, dhe në përgjithësi do të krijohet një efekt domino që zhvendos të gjitha ngjyrat e figurës.

Specifikimi JPEG nuk ju detyron të përdorni YCbCr. Megjithatë, në shumicën e skedarëve përdoret pikërisht ai, sepse pas nënmostrimit jep cilësi më të mirë të figurës krahasuar me RGB. Por nuk keni pse ta besoni vetëm fjalën time. Shiheni vetë në tabelën më poshtë se si duket nënmostrimi i secilit komponent veçmas, si në RGB ashtu edhe në YCbCr.

Si funksionon formati JPEG
(Versioni interaktiv – në origjinalin artikuj).

Heqja e blusë vërehet më pak sesa e kuqja ose e gjelbra. Kjo ndodh sepse nga gjashtë milionë qelizat konike në sytë tuaj, rreth 64% janë të ndjeshme ndaj së kuqes, 32% ndaj së gjelbrës dhe 2% ndaj blusë.

Nënmostrimi i komponentit Y (majtas poshtë) dallohet më qartë. Vërehet edhe një ndryshim i vogël.

Shndërrimi i figurës nga RGB në YCbCr nuk e zvogëlon madhësinë e skedarit, por e bën më të lehtë gjetjen e detajeve më pak të dukshme që mund të hiqen. Kompresimi me humbje ndodh në fazën e dytë. Në thelb të tij qëndron ideja e paraqitjes së të dhënave në një formë më të kompresueshme.

2. Transformimi diskret kosinus dhe kuantizimi

Ky nivel kompresimi përcakton në masë të madhe vetë thelbin e JPEG. Pas shndërrimit të ngjyrave në YCbCr, komponentët kompresohen veçmas, prandaj më tej mund të përqendrohemi vetëm te komponenti Y. Ja si duken bajtet e komponentit Y pas zbatimit të këtij niveli.

Si funksionon formati JPEG
(Versioni interaktiv – në origjinalin artikuj). Në versionin interaktiv, klikimi mbi një piksel e lëviz editorin te rreshti që e përfaqëson atë. Provoni të fshini numra nga fundi ose t’i shtoni disa zero një numri të caktuar.

Në shikim të parë, kjo duket si një kompresim shumë i dobët. Figura ka 100 000 pikselë dhe për të shënuar ndriçimin e tyre (komponentin Y) nevojiten 102 400 numra — kjo është edhe më keq sesa të mos kompresohet fare!

Megjithatë, vini re se shumica e këtyre numrave janë zero. Madje, të gjitha këto zero në fund të rreshtave mund të hiqen pa e ndryshuar figurën. Mbeten rreth 26 000 numra, që tashmë është pothuajse 4 herë më pak!

Në këtë nivel qëndron sekreti i modeleve si shah. Ndryshe nga efektet e tjera që kemi parë, shfaqja e këtyre modeleve nuk është një glitch. Ato janë blloqet ndërtuese të të gjithë figurës. Në çdo rresht të editorit ka saktësisht 64 numra, koeficientët e transformimit diskret kosinus (DCT), që korrespondojnë me intensitetet e 64 modeleve unike.

Këto modele formohen mbi bazën e grafikut të kosinusit. Ja si duken disa prej tyre:

Si funksionon formati JPEG
8 nga 64 koeficientë

Më poshtë është një figurë që paraqet të gjitha 64 modelet.

Si funksionon formati JPEG
(Versioni interaktiv – në origjinalin artikuj).

Këto modele kanë rëndësi të veçantë, sepse formojnë bazën e imazheve me përmasa 8x8. Nëse nuk jeni i njohur me algjebrën lineare, kjo do të thotë se çdo imazh me përmasa 8x8 mund të krijohet nga këto 64 modele. DCT është procesi i ndarjes së imazheve në blloqe 8x8 dhe i shndërrimit të secilit bllok në një kombinim të këtyre 64 koeficientëve.

Fakti që çdo imazh mund të ndërtohet nga 64 modele të caktuara duket si magji. Megjithatë, kjo është e njëjta gjë si të thuash se çdo vend në Tokë mund të përshkruhet me dy numra – gjerësinë dhe gjatësinë gjeografike [с указанием полушарий / прим. перев.]. Ne shpesh e konsiderojmë sipërfaqen e Tokës si dydimensionale, ndaj na duhen vetëm dy numra. Një imazh 8x8 ka 64 dimensione, prandaj na duhen 64 numra.

Ende nuk është e qartë se si kjo na ndihmon për sa i përket kompresimit. Nëse na duhen 64 numra për të përfaqësuar një imazh 8x8, pse kjo metodë do të ishte më e mirë sesa thjesht ruajtja e 64 komponentëve të ndriçimit? Ne e bëjmë këtë për të njëjtën arsye për të cilën i shndërruam tre numrat RGB në tre numra YCbCr: kjo na lejon të heqim detaje të padukshme.

Është e vështirë të shihet saktësisht se cilat detaje hiqen në këtë fazë, sepse JPEG zbaton DCT mbi blloqe 8x8. Megjithatë, asgjë nuk na pengon ta zbatojmë atë mbi të gjithë figurën. Ja si duket DCT për komponentin Y kur zbatohet mbi të gjithë figurën:

Si funksionon formati JPEG

Nga fundi mund të hiqen më shumë se 60 000 numra, pothuajse pa asnjë ndryshim të dukshëm në foto.

Si funksionon formati JPEG

Megjithatë, vini re se nëse zeromë pesë numrat e parë, ndryshimi do të jetë i dukshëm.

Si funksionon formati JPEG

Numrat në fillim përfaqësojnë ndryshime me frekuencë të ulët në imazh, dhe sytë tanë i dallojnë më mirë. Numrat më pranë fundit përfaqësojnë ndryshime me frekuencë të lartë, të cilat janë më të vështira për t’u vënë re. Për të “parë atë që syri nuk e sheh”, mund t’i izolojmë këto detaje me frekuencë të lartë duke zeruar 5000 numrat e parë.

Si funksionon formati JPEG

Ne shohim të gjitha zonat e imazhit ku ndodh ndryshimi më i madh nga një piksel te tjetri. Bien në sy sytë e maces, mustaqet e saj, batanija me push dhe hijet në këndin e poshtëm majtas. Mund të shkojmë edhe më tej, duke zeruar 10 000 numrat e parë:

Si funksionon formati JPEG

20 000:

Si funksionon formati JPEG

40 000:

Si funksionon formati JPEG

60 000:

Si funksionon formati JPEG

JPEG i heq këto detaje me frekuencë të lartë gjatë fazës së kompresimit. Shndërrimi i ngjyrave në koeficientë DCT nuk shkakton humbje. Humbjet krijohen në hapin e kuantizimit, ku hiqen vlerat me frekuencë të lartë ose ato shumë pranë zeros. Kur ulni cilësinë e ruajtjes së JPEG, programi rrit pragun e numrit të vlerave që hiqen, gjë që zvogëlon madhësinë e skedarit, por e bën figurën më të pikselizuar. Prandaj imazhi në seksionin e parë, i cili ishte 57 herë më i vogël, dukej kështu. Çdo bllok 8x8 përfaqësohej nga shumë më pak koeficientë DCT në krahasim me versionin me cilësi më të lartë.

Mund të krijohet edhe një efekt i bukur si transmetimi progresiv i imazheve. Mund të shfaqet një figurë e turbullt, e cila bëhet gjithnjë e më e detajuar ndërsa shkarkohen gjithnjë e më shumë koeficientë.

Ja, vetëm për kuriozitet, çfarë del kur përdoren vetëm 24 000 numra:

Si funksionon formati JPEG

Ose vetëm 5000:

Si funksionon formati JPEG

Shumë e turbullt, por gjithsesi disi e dallueshme!

3. Kodimi run-length, delta dhe Huffman

Deri tani, të gjitha fazat e kompresimit kanë qenë me humbje. Faza e fundit, përkundrazi, është pa humbje. Ajo nuk heq informacion, por megjithatë e zvogëlon ndjeshëm madhësinë e skedarit.

Si mund të kompresohet diçka pa hedhur poshtë informacionin? Imagjinoni si do ta përshkruanim një drejtkëndësh të thjeshtë të zi 700 x 437.

JPEG përdor për këtë 5000 numra, por mund të arrihet një rezultat shumë më i mirë. A mund të imagjinoni një skemë kodimi që do ta përshkruante një imazh të tillë me sa më pak bajte të jetë e mundur?

Skema minimale që kam arritur të mendoj përdor katër: tre për të treguar ngjyrën dhe i katërti për të treguar sa pikselë kanë atë ngjyrë. Ideja e paraqitjes së vlerave të përsëritura në këtë mënyrë të ngjeshur quhet kodim run-length. Ajo është pa humbje, sepse mund t’i rikthejmë të dhënat e koduara në formën e tyre origjinale.

Madhësia e një skedari JPEG me një drejtkëndësh të zi është shumë më e madhe se 4 bajtë — kujtoni se në nivelin DCT, kompresimi zbatohet mbi blloqe 8x8 pikselësh. Prandaj, minimumi na duhet një koeficient DCT për çdo 64 pikselë. Na duhet vetëm një, sepse në vend që të ruajmë një koeficient DCT të ndjekur nga 63 zero, kodimi i gjatësisë së serive na lejon të ruajmë një numër të vetëm dhe të tregojmë se «të gjitha të tjerat janë zero».

Kodimi delta është një teknikë ku çdo bajt përmban ndryshimin ndaj një vlere të caktuar, jo vlerën absolute. Prandaj, redaktimi i bajtëve të caktuar ndryshon ngjyrën e të gjithë pikselëve të tjerë. Për shembull, në vend që të ruajmë

12 13 14 14 14 13 13 14

Mund të fillonim me 12 dhe më pas thjesht të tregonim sa duhet shtuar ose zbritur për të marrë numrin pasues. Në kodimin delta, kjo sekuencë merr këtë formë:

12 1 1 0 0 -1 0 1

Të dhënat e transformuara nuk bëhen më të vogla se ato origjinale, por tashmë janë më të lehta për t'u kompresuar. Përdorimi i kodimit delta përpara kodimit të gjatësisë së serive mund të ndihmojë ndjeshëm, duke mbetur njëkohësisht një formë kompresimi pa humbje.

Kodimi delta është një nga teknikat e pakta që përdoren jashtë blloqeve 8x8. Nga 64 koeficientët DCT, njëri është thjesht një funksion valore konstant (ngjyrë e njëtrajtshme). Ai përfaqëson ndriçimin mesatar të çdo blloku për komponentët e ndriçimit, ose shkallën mesatare të blusë për komponentët Cb, e kështu me radhë. Vlera e parë e çdo blloku DCT quhet vlerë DC, dhe çdo vlerë DC i nënshtrohet kodimit delta në raport me ato të mëparshmet. Prandaj, ndryshimi i ndriçimit të bllokut të parë do të ndikojë në të gjitha blloqet.

Mbetet edhe misteri i fundit: si mundet që ndryshimi i një numri të vetëm ta prishë plotësisht të gjithë figurën? Deri tani, nivelet e kompresimit nuk kishin veti të tilla. Përgjigjja gjendet në header-in e JPEG. 500 bajtët e parë përmbajnë metadata për imazhin — gjerësinë, lartësinë e të tjera — dhe deri tani nuk kemi punuar me to.

Pa header-in, dekodimi i një JPEG është pothuajse i pamundur, ose të paktën shumë i vështirë. Do të dukej sikur po përpiqem t'ju përshkruaj një pikturë dhe po filloj të shpik fjalë për të përcjellë përshtypjen time. Përshkrimi ndoshta do të ishte shumë i ngjeshur, sepse mund të shpik fjalë pikërisht me kuptimin që dua të përcjell, por për të gjithë të tjerët ato nuk do të kishin asnjë kuptim.

Tingëllon marrëzisht, por pikërisht kështu ndodh. Çdo imazh JPEG kompresohet me kode specifike vetëm për të. Fjalori i kodeve ruhet në header. Kjo teknikë quhet «kodi Huffman», ndërsa fjalori quhet tabelë Huffman. Në header, tabela shënohet me dy bajte — 255 dhe më pas 196. Çdo komponent ngjyre mund të ketë tabelën e vet.

Ndryshimi i tabelave do të ndikojë rrënjësisht në çdo imazh. Një shembull i mirë është zëvendësimi i 1 me 12 në rreshtin e 15-të.

Si funksionon formati JPEG

Kjo ndodh sepse tabelat përcaktojnë si duhen lexuar bitët individualë. Deri tani kemi punuar vetëm me numra binarë të paraqitur në formë dhjetore. Por kjo na e fsheh faktin se, nëse doni të ruani numrin 1 në një bajt, ai do të duket si 00000001, sepse çdo bajt duhet të ketë saktësisht tetë bitë, edhe nëse ju duhet vetëm një prej tyre.

Potencialisht, kjo është një humbje e madhe hapësire nëse keni shumë numra të vegjël. Kodi Huffman është një teknikë që na lejon ta zbusim këtë kërkesë, sipas së cilës çdo numër duhet të zërë tetë bitë. Kjo do të thotë se, nëse shihni dy bajte:

234 115

Atëherë, në varësi të tabelës Huffman, ato mund të përfaqësojnë tre numra. Për t’i nxjerrë, së pari duhet t’i ndani në bitë të veçantë:

11101010 01110011

Më pas i referohemi tabelës për të kuptuar si duhen grupuar. Për shembull, këta mund të jenë gjashtë bitët e parë, (111010), ose 58 në sistemin dhjetor, të ndjekur nga pesë bitë (10011), ose 19, dhe në fund katër bitët e fundit (0011), ose 3.

Prandaj është shumë e vështirë të kuptosh bajtet në këtë fazë të kompresimit. Bajtet nuk përfaqësojnë atë që duket. Nuk do të hyj më thellë në detajet e punës me tabelën në këtë artikull, por materiale për këtë temë në internet është mjaft.

Një nga truket interesante që mund të bëni duke e ditur këtë është të ndani header-in nga JPEG dhe ta ruani veçmas. Në thelb, rezulton që skedarin do të mund ta lexoni vetëm ju. Facebook e bën këtë për t’i zvogëluar skedarët edhe më shumë.

Një gjë tjetër që mund të bëni është të ndryshoni fare pak tabelën Huffman. Për të tjerët kjo do të duket si një figurë e dëmtuar. Dhe vetëm ju do ta dini mënyrën magjike për ta rregulluar.

Le ta përmbledhim: çfarë duhet për të dekoduar JPEG? Duhet:

  1. Të nxirrni tabelën (ose tabelat) Huffman nga header-i dhe të dekodoni bitët.
  2. Nxirrni koeficientët e transformimit diskret kosinus për secilin komponent të ngjyrës dhe ndriçimit për çdo bllok 8×8, duke kryer dekodimin e kundërt të run-length dhe delta-kodimit.
  3. Kombinoni kosinusët mbi bazën e koeficientëve për të marrë vlerat e pikselëve për çdo bllok 8×8.
  4. Shkallëzoni komponentët e ngjyrës, nëse është përdorur nënmostrim (ky informacion gjendet në header).
  5. Konvertoni vlerat e marra YCbCr për çdo piksel në RGB.
  6. Shfaqeni imazhin në ekran!

Punë goxha serioze vetëm për të parë një foto me një mace! Megjithatë, pikërisht kjo më pëlqen: shihet qartë sa e orientuar ndaj njeriut është teknologjia JPEG. Ajo bazohet në veçoritë e perceptimit tonë, duke mundësuar një kompresim shumë më efikas se teknologjitë e zakonshme. Dhe tani, duke kuptuar si funksionon JPEG, mund të përfytyrohet se si këto parime mund të transferohen edhe në fusha të tjera. Për shembull, delta-kodimi në video mund të sjellë një ulje të ndjeshme të madhësisë së skedarit, sepse aty shpesh ka zona të tëra që nuk ndryshojnë nga një kuadër në tjetrin (për shembull, sfondi).

Kodi i përdorur në artikullështë i hapur dhe përmban udhëzime se si t’i zëvendësoni imazhet me tuajat.

Burimi: habr.com

Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS 🔥 Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS | ProHoster