JPEG attÄli ir visuresoÅ”i mÅ«su digitÄlajÄ dzÄ«vÄ, taÄu aiz Ŕī izpratnes finiera slÄpjas algoritmi, kas noÅem detaļas, kas nav uztveramas cilvÄka acij. RezultÄts ir augstÄkÄ vizuÄlÄ kvalitÄte mazÄkajÄ faila izmÄrÄ ā bet kÄ tieÅ”i tas viss darbojas? PaskatÄ«simies, ko tieÅ”i mÅ«su acis neredz!
Ir viegli uztvert iespÄju nosÅ«tÄ«t fotoattÄlu draugam un neuztraukties par to, kÄdu ierÄ«ci, pÄrlÅ«kprogrammu vai operÄtÄjsistÄmu viÅi izmanto, taÄu tas ne vienmÄr bija tÄ. LÄ«dz 1980. gadu sÄkumam datori varÄja uzglabÄt un parÄdÄ«t digitÄlos attÄlus, taÄu bija daudz konkurÄjoÅ”u ideju par labÄko veidu, kÄ to izdarÄ«t. JÅ«s nevarat vienkÄrÅ”i nosÅ«tÄ«t attÄlu no viena datora uz otru un cerÄt, ka tas darbosies.
Lai atrisinÄtu Å”o problÄmu, 1986. gadÄ tika sapulcinÄta ekspertu komiteja no visas pasaules ar nosaukumu "ApvienotÄ fotogrÄfijas ekspertu grupaĀ» (Joint Photography Experts Group, JPEG), kas dibinÄta, kopÄ«gi strÄdÄjot starp Starptautisko standartizÄcijas organizÄciju (ISO) un Starptautisko elektrotehnisko komisiju (IEC), divÄm starptautiskÄm standartizÄcijas organizÄcijÄm, kuru galvenÄ mÄ«tne atrodas ŽenÄvÄ, Å veicÄ.
CilvÄku grupa JPEG izveidoja JPEG digitÄlo attÄlu saspieÅ”anas standartu 1992. gadÄ. Ikviens, kurÅ” izmantojis internetu, droÅ”i vien ir saskÄries ar JPEG kodÄtiem attÄliem. Å is ir visizplatÄ«tÄkais attÄlu kodÄÅ”anas, sÅ«tÄ«Å”anas un uzglabÄÅ”anas veids. No tÄ«mekļa lapÄm lÄ«dz e-pastam un sociÄlajiem saziÅas lÄ«dzekļiem JPEG tiek izmantots miljardiem reižu dienÄ ā praktiski katru reizi, kad mÄs skatÄmies attÄlu tieÅ”saistÄ vai nosÅ«tÄm to. Bez JPEG tÄ«meklis bÅ«tu mazÄk krÄsains, lÄnÄks un, iespÄjams, tajÄ bÅ«tu mazÄk kaÄ·u attÄlu!
Å is raksts ir par to, kÄ atÅ”ifrÄt JPEG attÄlu. Citiem vÄrdiem sakot, kas ir nepiecieÅ”ams, lai datorÄ saglabÄtos saspiestos datus pÄrvÄrstu attÄlÄ, kas parÄdÄs ekrÄnÄ. To ir vÄrts zinÄt ne tikai tÄpÄc, ka ir svarÄ«gi izprast katru dienu lietojamo tehnoloÄ£iju, bet arÄ« tÄpÄc, ka, atbloÄ·Äjot saspieÅ”anas lÄ«meÅus, mÄs uzzinÄm vairÄk par uztveri un redzi un uz kÄdÄm detaļÄm mÅ«su acis ir visjutÄ«gÄkÄs.
TurklÄt Å”ÄdÄ veidÄ spÄlÄties ar attÄliem ir ļoti interesanti.
Skatos iekÅ”Ä JPEG
DatorÄ viss tiek saglabÄts kÄ binÄro skaitļu secÄ«ba. Parasti Å”ie biti, nulles un vieninieki, tiek grupÄti grupÄs pa astoÅiem, lai veidotu baitus. Atverot JPEG attÄlu datorÄ, kaut kam (pÄrlÅ«kam, operÄtÄjsistÄmai, kaut kam citam) ir jÄatÅ”ifrÄ baiti, atjaunojot sÄkotnÄjo attÄlu kÄ krÄsu sarakstu, ko var parÄdÄ«t.
Ja lejupielÄdÄjat Å”o saldo kaÄ·a fotogrÄfija un atveriet to teksta redaktorÄ, jÅ«s redzÄsiet virkni nesakarÄ«gu rakstzÄ«mju.
Å eit es izmantoju Notepad++, lai pÄrbaudÄ«tu faila saturu, jo parastie teksta redaktori, piemÄram, Notepad operÄtÄjsistÄmÄ Windows, pÄc saglabÄÅ”anas sabojÄs binÄro failu un tas vairs neatbilst JPEG formÄtam.
AttÄla atvÄrÅ”ana tekstapstrÄdes programmÄ mulsina datoru, tÄpat kÄ jÅ«s sajaucat smadzenes, kad berzÄjat acis un sÄkat redzÄt krÄsu plankumus!
Å Ä«s redzamÄs vietas ir zinÄmas kÄ fosfÄni, un tie nav gaismas stimula vai prÄta radÄ«tas halucinÄcijas rezultÄts. Tie rodas tÄpÄc, ka jÅ«su smadzenes domÄ, ka jebkuri elektriskie signÄli redzes nervos pÄrraida informÄciju par gaismu. SmadzenÄm ir jÄizdara Å”ie pieÅÄmumi, jo nevar zinÄt, vai signÄls ir skaÅa, vÄ«zija vai kas cits. Visi Ä·ermeÅa nervi pÄrraida tieÅ”i tÄdus paÅ”us elektriskos impulsus. Izdarot spiedienu uz acÄ«m, jÅ«s sÅ«tÄt signÄlus, kas nav vizuÄli, bet aktivizÄ acs receptorus, kurus jÅ«su smadzenes interpretÄ - Å”ajÄ gadÄ«jumÄ nepareizi - kÄ kaut ko vizuÄlu. JÅ«s varat burtiski redzÄt spiedienu!
Ir smieklÄ«gi domÄt par to, cik datori ir lÄ«dzÄ«gi smadzenÄm, taÄu tÄ ir arÄ« noderÄ«ga lÄ«dzÄ«ba, lai ilustrÄtu, cik lielÄ mÄrÄ datu nozÄ«me - neatkarÄ«gi no tÄ, vai tie tiek pÄrnesti caur Ä·ermeni ar nerviem vai saglabÄti datorÄ - ir atkarÄ«ga no to interpretÄcijas. Visi binÄrie dati sastÄv no 0 un 1 ā pamata komponentiem, kas var nodot jebkÄda veida informÄciju. JÅ«su dators bieži izdomÄ, kÄ tos interpretÄt, izmantojot norÄdes, piemÄram, failu paplaÅ”inÄjumus. Tagad mÄs piespiežam tos interpretÄt kÄ tekstu, jo tas ir tas, ko teksta redaktors sagaida.
Lai saprastu, kÄ atÅ”ifrÄt JPEG, mums ir jÄredz paÅ”i sÄkotnÄjie signÄli - binÄrie dati. To var izdarÄ«t, izmantojot heksadecimÄlo redaktoru vai tieÅ”i uz oriÄ£inÄlÄ raksta tÄ«mekļa lapa! Ir attÄls, kuram blakus teksta laukÄ ir visi tÄ baiti (izÅemot galveni), kas parÄdÄ«ti decimÄldaļÄ. Varat tos mainÄ«t, un skripts tiks atkÄrtoti kodÄts un lidojuma laikÄ izveidos jaunu attÄlu.
SpÄlÄjot ar Å”o redaktoru, jÅ«s varat daudz uzzinÄt. PiemÄram, vai varat pateikt, kÄdÄ secÄ«bÄ pikseļi tiek glabÄti?
DÄ«vainÄkais Å”ajÄ piemÄrÄ ir tas, ka dažu skaitļu maiÅa vispÄr neietekmÄ attÄlu, bet, piemÄram, ja pirmajÄ rindÄ ciparu 17 nomainÄ«sit ar 0, fotogrÄfija tiks pilnÄ«bÄ sabojÄta!
Citas izmaiÅas, piemÄram, 7. rindas 1988 aizstÄÅ”ana ar numuru 254, maina krÄsu, bet tikai nÄkamajiem pikseļiem.
VarbÅ«t dÄ«vainÄkais ir tas, ka daži cipari maina ne tikai attÄla krÄsu, bet arÄ« formu. Mainiet 70 12. rindÄ uz 2 un skatiet attÄla augÅ”Äjo rindu, lai redzÄtu, ko es domÄju.
Un neatkarÄ«gi no tÄ, kÄdu JPEG attÄlu jÅ«s izmantojat, jÅ«s vienmÄr atradÄ«sit Å”os noslÄpumainos Å”aha modeļus, rediÄ£Äjot baitus.
SpÄlÄjot ar redaktoru, ir grÅ«ti saprast, kÄ no Å”iem baitiem tiek atjaunots fotoattÄls, jo JPEG saspieÅ”ana sastÄv no trÄ«s dažÄdÄm tehnoloÄ£ijÄm, kas tiek lietotas secÄ«gi pa lÄ«meÅiem. MÄs izpÄtÄ«sim katru atseviŔķi, lai atklÄtu noslÄpumaino uzvedÄ«bu, ko mÄs redzam.
Lai sniegtu priekÅ”statu par saspieÅ”anas apjomu, Åemiet vÄrÄ, ka iepriekÅ” redzamajÄ attÄlÄ ir 79 819 skaitļi jeb aptuveni 79 KB. Ja mÄs to saglabÄtu bez saspieÅ”anas, katram pikselim bÅ«tu nepiecieÅ”ami trÄ«s skaitļi - sarkanajam, zaļajam un zilajam komponentam. Tas bÅ«tu 917 700 numuri jeb aptuveni. 917 KB. JPEG saspieÅ”anas rezultÄtÄ gala fails tika samazinÄts vairÄk nekÄ 10 reizes!
PatiesÄ«bÄ Å”o attÄlu var saspiest daudz vairÄk. ZemÄk ir divi attÄli blakus - labajÄ pusÄ esoÅ”ais fotoattÄls ir saspiests lÄ«dz 16 KB, tas ir, 57 reizes mazÄks nekÄ nesaspiestÄ versija!
Ieskatoties uzmanÄ«gi, jÅ«s redzÄsiet, ka Å”ie attÄli nav identiski. Abi ir attÄli ar JPEG saspieÅ”anu, bet labajam ir daudz mazÄks apjoms. Tas arÄ« izskatÄs nedaudz sliktÄk (paskatieties uz fona krÄsu kvadrÄtiem). TÄpÄc JPEG tiek saukta arÄ« par zudumu saspieÅ”anu; SaspieÅ”anas procesÄ attÄls mainÄs un zaudÄ dažas detaļas.
1. KrÄsu apakÅ”izlase
Å eit ir attÄls, kuram ir piemÄrots tikai pirmais saspieÅ”anas lÄ«menis.
(InteraktÄ«vÄ versija ā in oriÄ£inÄls raksti). NoÅemot vienu numuru, tiek iznÄ«cinÄtas visas krÄsas. TomÄr, ja tiek noÅemti tieÅ”i seÅ”i skaitļi, tas praktiski neietekmÄ attÄlu.
Tagad skaitļus ir nedaudz vieglÄk atÅ”ifrÄt. Å is ir gandrÄ«z vienkÄrÅ”s krÄsu saraksts, kurÄ katrs baits maina tieÅ”i vienu pikseļu, bet tajÄ paÅ”Ä laikÄ tas jau ir uz pusi mazÄks nekÄ nesaspiestÄ attÄla izmÄrs (kas Å”ajÄ samazinÄtajÄ izmÄrÄ aizÅemtu ap 300 KB). Vai varat uzminÄt, kÄpÄc?
Var redzÄt, ka Å”ie skaitļi neatspoguļo standarta sarkano, zaļo un zilo komponentu, jo, ja visus skaitļus aizstÄsim ar nullÄm, mÄs iegÅ«sim zaļu attÄlu (nevis baltu).
Tas ir tÄpÄc, ka Å”ie baiti apzÄ«mÄ Y (spilgtums),
Cb (relatīvais zilums),
un Cr (relatÄ«vais apsÄrtums) attÄli.
KÄpÄc neizmantot RGB? Galu galÄ Å”Ädi darbojas lielÄkÄ daļa mÅ«sdienu ekrÄnu. JÅ«su monitors var attÄlot jebkuru krÄsu, tostarp sarkanu, zaļu un zilu, ar atŔķirÄ«gu intensitÄti katram pikselim. Balto krÄsu iegÅ«st, ieslÄdzot visus trÄ«s ar pilnu spilgtumu, un melno, tos izslÄdzot.
Tas ir arÄ« ļoti lÄ«dzÄ«gs tam, kÄ darbojas cilvÄka acs. KrÄsu receptorus mÅ«su acÄ«s sauc par "konusiā, un ir sadalÄ«ti trÄ«s veidos, no kuriem katrs ir jutÄ«gÄks pret sarkanu, zaļu vai zilu krÄsu [S veida konusi ir jutÄ«gi violeti zilÄ krÄsÄ (S no angļu valodas Short - Ä«sviļÅu spektrs), M -tips - zaļi-dzeltenajÄ (M no angļu valodas Medium - vidÄjais vilnis) un L-tips - dzeltensarkanajÄ (L no angļu valodas Long - long-wave) spektra daļÄs. Å o trÄ«s veidu konusu (un stieÅu, kas ir jutÄ«gi smaragdzaļajÄ spektra daļÄ) klÄtbÅ«tne sniedz cilvÄkam krÄsu redzi. / apm. tulk.]. NÅ«jas, cita veida fotoreceptoru mÅ«su acÄ«s, spÄj noteikt spilgtuma izmaiÅas, taÄu tas ir daudz jutÄ«gÄks pret krÄsÄm. MÅ«su acÄ«m ir aptuveni 120 miljoni stieÅu un tikai 6 miljoni konusu.
TÄpÄc mÅ«su acis daudz labÄk nosaka spilgtuma izmaiÅas nekÄ krÄsas izmaiÅas. Ja atdala krÄsu no spilgtuma, varat noÅemt nedaudz krÄsas, un neviens neko nepamanÄ«s. KrÄsu apakÅ”izlase ir process, kurÄ attÄla krÄsu komponenti tiek attÄloti ar zemÄku izŔķirtspÄju nekÄ spilgtuma komponenti. IepriekÅ” minÄtajÄ piemÄrÄ katram pikselim ir tieÅ”i viens Y komponents, un katrai atseviŔķai Äetru pikseļu grupai ir tieÅ”i viens Cb un viens Cr komponents. TÄpÄc attÄlÄ ir Äetras reizes mazÄk krÄsu informÄcijas nekÄ oriÄ£inÄlÄ.
YCbCr krÄsu telpa tiek izmantota ne tikai JPEG formÄtÄ. SÄkotnÄji tas tika izgudrots 1938. gadÄ televÄ«zijas programmÄm. Ne visiem ir krÄsu televizors, tÄpÄc krÄsu un spilgtuma atdalÄ«Å”ana ļÄva visiem iegÅ«t vienÄdu signÄlu, un televizori bez krÄsÄm vienkÄrÅ”i izmantoja tikai spilgtuma komponentu.
TÄtad viena numura noÅemÅ”ana no redaktora pilnÄ«bÄ sabojÄ visas krÄsas. Komponenti tiek glabÄti formÄ Y Y Y Y Cb Cr (patiesÄ«bÄ, ne obligÄti tÄdÄ secÄ«bÄ - uzglabÄÅ”anas pasÅ«tÄ«jums ir norÄdÄ«ts faila galvenÄ). NoÅemot pirmo skaitli, Cb pirmÄ vÄrtÄ«ba tiks uztverta kÄ Y, Cr kÄ Cb, un kopumÄ jÅ«s iegÅ«sit domino efektu, kas pÄrslÄdz visas attÄla krÄsas.
JPEG specifikÄcija neliek jums izmantot YCbCr. Bet lielÄkÄ daļa failu to izmanto, jo tas rada labÄkus samazinÄtus attÄlus nekÄ RGB. Bet jums nav jÄpieÅem mans vÄrds. Skatieties tÄlÄk esoÅ”ajÄ tabulÄ, kÄ katra atseviŔķa komponenta apakÅ”iztverÅ”ana izskatÄ«sies gan RGB, gan YCbCr.
(InteraktÄ«vÄ versija ā in oriÄ£inÄls raksti).
ZilÄs krÄsas noÅemÅ”ana nav tik pamanÄma kÄ sarkanÄ vai zaļÄ. Tas ir tÄpÄc, ka jÅ«su acÄ«s ir seÅ”i miljoni konusu, apmÄram 64% ir jutÄ«gi pret sarkanu, 32% pret zaļu un 2% pret zilu.
VislabÄk ir redzama Y komponenta izlases samazinÄÅ”ana (apakÅ”ÄjÄ kreisajÄ pusÄ). Pat nelielas izmaiÅas ir pamanÄmas.
AttÄla konvertÄÅ”ana no RGB uz YCbCr nesamazina faila lielumu, taÄu atvieglo mazÄk redzamu detaļu atraÅ”anu, kuras var noÅemt. ZaudÄjumu saspieÅ”ana notiek otrajÄ posmÄ. TÄ pamatÄ ir ideja par datu uzrÄdÄ«Å”anu saspiežamÄkÄ formÄ.
2. DiskrÄtÄ kosinusa transformÄcija un izlase
Å is saspieÅ”anas lÄ«menis lielÄkoties ir JPEG. PÄc krÄsu konvertÄÅ”anas YCbCr, komponenti tiek saspiesti atseviŔķi, lai mÄs varÄtu koncentrÄties tikai uz Y komponentu. Un lÅ«k, kÄ izskatÄs Y komponenta baiti pÄc Ŕī slÄÅa uzklÄÅ”anas.
(InteraktÄ«vÄ versija ā in oriÄ£inÄls raksti). InteraktÄ«vajÄ versijÄ, noklikŔķinot uz pikseļa, redaktors tiek ritinÄts lÄ«dz rindai, kas to attÄlo. MÄÄ£iniet noÅemt skaitļus no beigÄm vai pievienot noteiktam skaitlim dažas nulles.
No pirmÄ acu uzmetiena izskatÄs, ka kompresija ir ļoti slikta. AttÄlÄ ir 100 000 pikseļu, un ir nepiecieÅ”ami 102 400 skaitļi, lai attÄlotu to spilgtumu (Y komponenti) ā tas ir sliktÄk nekÄ neko nesaspiest!
TomÄr Åemiet vÄrÄ, ka lielÄkÄ daļa no Å”iem skaitļiem ir nulle. TurklÄt visas Ŕīs nulles rindu beigÄs var noÅemt, nemainot attÄlu. PalikuÅ”i aptuveni 26 000 numuru, un tas ir gandrÄ«z 4 reizes mazÄk!
Å ajÄ lÄ«menÄ« ir ietverts Å”aha modeļu noslÄpums. AtŔķirÄ«bÄ no citiem efektiem, ko esam redzÄjuÅ”i, Å”o rakstu izskats nav kļūme. Tie ir visa attÄla veidoÅ”anas bloki. KatrÄ redaktora rindÄ ir precÄ«zi 64 skaitļi, diskrÄtÄs kosinusa transformÄcijas (DCT) koeficienti, kas atbilst 64 unikÄlu modeļu intensitÄtei.
Å ie modeļi tiek veidoti, pamatojoties uz kosinusa diagrammu. LÅ«k, kÄ daži no tiem izskatÄs:
8 no 64 koeficientiem
ZemÄk ir attÄls, kurÄ parÄdÄ«ti visi 64 modeļi.
(InteraktÄ«vÄ versija ā in oriÄ£inÄls raksti).
Å ie modeļi ir Ä«paÅ”i svarÄ«gi, jo tie veido 8x8 attÄlu pamatu. Ja jÅ«s nepazÄ«stat lineÄro algebru, tas nozÄ«mÄ, ka no Å”iem 8 modeļiem var izveidot jebkuru 8x64 attÄlu. DCT ir process, kurÄ attÄlus sadala 8x8 blokos un katru bloku pÄrvÄrÅ” Å”o 64 koeficientu kombinÄcijÄ.
Å Ä·iet maÄ£iski, ka jebkuru attÄlu var veidot no 64 konkrÄtiem rakstiem. TaÄu tas ir tas pats, kas teikt, ka jebkuru vietu uz Zemes var raksturot ar diviem cipariem ā platumu un garumu [norÄda puslodes / apm. tulk.]. MÄs bieži domÄjam par Zemes virsmu kÄ divdimensiju, tÄpÄc mums ir nepiecieÅ”ami tikai divi skaitļi. 8x8 attÄlam ir 64 izmÄri, tÄpÄc mums ir nepiecieÅ”ami 64 cipari.
VÄl nav skaidrs, kÄ tas mums palÄ«dz saspieÅ”anas ziÅÄ. Ja mums ir nepiecieÅ”ami 64 skaitļi, lai attÄlotu 8x8 attÄlu, kÄpÄc tas bÅ«tu labÄk nekÄ tikai 64 spilgtuma komponentu saglabÄÅ”ana? MÄs to darÄm tÄ paÅ”a iemesla dÄļ, ka trÄ«s RGB skaitļus pÄrvÄrtÄm trÄ«s YCbCr skaitļos: tas ļauj noÅemt smalkas detaļas.
Å ajÄ posmÄ ir grÅ«ti precÄ«zi redzÄt, kura detaļa ir noÅemta, jo JPEG 8 x 8 blokiem izmanto DCT. TaÄu neviens mums neliedz to attiecinÄt uz visu attÄlu. LÅ«k, kÄ DCT izskatÄs Y komponentam, kas tiek lietots visam attÄlam:
VairÄk nekÄ 60 000 skaitļu var noÅemt no beigÄm, praktiski bez manÄmÄm izmaiÅÄm fotoattÄlÄ.
TomÄr Åemiet vÄrÄ, ka, ja mÄs noÅemsim pirmos piecus skaitļus, atŔķirÄ«ba bÅ«s acÄ«mredzama.
Cipari sÄkumÄ attÄlo zemas frekvences izmaiÅas attÄlÄ, kuras mÅ«su acis uztver vislabÄk. Skaitļi beigÄs norÄda uz izmaiÅÄm augstajÄs frekvencÄs, kuras ir grÅ«tÄk pamanÄ«t. Lai "redzÄtu to, ko acs neredz", mÄs varam izolÄt Ŕīs augstfrekvences detaļas, atceļot pirmos 5000 skaitļus.
MÄs redzam visus attÄla apgabalus, kuros notiek vislielÄkÄs izmaiÅas no pikseļa uz pikseļu. Izceļas kaÄ·a acis, Å«sas, frotÄ sega un Änas apakÅ”ÄjÄ kreisajÄ stÅ«rÄ«. Varat iet tÄlÄk, atceļot pirmos 10 000 skaitļus:
20 000:
40 000:
60 000:
Å Ä«s augstfrekvences detaļas tiek noÅemtas, izmantojot JPEG kompresijas stadijÄ. PÄrvÄrÅ”ot krÄsas DCT koeficientos, nav nekÄdu zaudÄjumu. Zudumi rodas paraugu ÅemÅ”anas posmÄ, kur tiek noÅemtas augstfrekvences vai nullei tuvu vÄrtÄ«bas. Samazinot JPEG saglabÄÅ”anas kvalitÄti, programma palielina noÅemto vÄrtÄ«bu skaita slieksni, kas samazina faila lielumu, bet padara attÄlu vairÄk pikseļu. TÄpÄc attÄls pirmajÄ sadaļÄ, kas bija 57 reizes mazÄks, izskatÄ«jÄs Å”Ädi. Katrs 8x8 bloks tika attÄlots ar daudz mazÄk DCT koeficientu, salÄ«dzinot ar augstÄkas kvalitÄtes versiju.
Varat izveidot tik forÅ”u efektu kÄ pakÄpeniska attÄlu straumÄÅ”ana. Varat parÄdÄ«t izplÅ«duÅ”u attÄlu, kas kļūst arvien detalizÄtÄks, jo tiek lejupielÄdÄti arvien vairÄk koeficientu.
LÅ«k, tikai prieka pÄc, ko jÅ«s iegÅ«stat, izmantojot tikai 24 000 ciparu:
Vai tikai 5000:
Ä»oti miglaini, bet kaut kÄ atpazÄ«stami!
3. Palaist garuma kodÄjumu, delta un Huffman
LÄ«dz Å”im visi saspieÅ”anas posmi ir bijuÅ”i ar zaudÄjumiem. PÄdÄjais posms, gluži pretÄji, norit bez zaudÄjumiem. Tas neizdzÄÅ” informÄciju, bet ievÄrojami samazina faila lielumu.
KÄ var kaut ko saspiest, neizmetot informÄciju? IedomÄjieties, kÄ mÄs aprakstÄ«tu vienkÄrÅ”u melnu taisnstÅ«ri 700 x 437.
JPEG Å”im nolÅ«kam tiek izmantoti 5000 skaitļi, taÄu var sasniegt daudz labÄkus rezultÄtus. Vai varat iedomÄties kodÄÅ”anas shÄmu, kas Å”Ädu attÄlu aprakstÄ«tu pÄc iespÄjas mazÄkÄ baitÄ?
MinimÄlÄ shÄma, ko es varÄtu nÄkt klajÄ, izmanto Äetrus: trÄ«s, lai attÄlotu krÄsu, un ceturtÄ, lai norÄdÄ«tu, cik pikseļu ir Å”ai krÄsai. Ideju attÄlot atkÄrtotas vÄrtÄ«bas Å”ÄdÄ saÄ«sinÄtÄ veidÄ sauc par izpildes garuma kodÄÅ”anu. Tas ir bez zudumiem, jo āāmÄs varam atjaunot kodÄtos datus to sÄkotnÄjÄ formÄ.
JPEG fails ar melnu taisnstÅ«ri ir daudz lielÄks par 4 baitiem ā atcerieties, ka DCT lÄ«menÄ« saspieÅ”ana tiek piemÄrota 8x8 pikseļu blokiem. TÄpÄc mums ir nepiecieÅ”ams vismaz viens DCT koeficients katriem 64 pikseļiem. Mums tas ir vajadzÄ«gs, jo tÄ vietÄ, lai saglabÄtu vienu DCT koeficientu, kam seko 63 nulles, darbÄ«bas garuma kodÄÅ”ana ļauj mums saglabÄt vienu skaitli un norÄdÄ«t, ka "visi pÄrÄjie ir nulles".
Delta kodÄÅ”ana ir metode, kurÄ katrs baits satur atŔķirÄ«bu no kÄdas vÄrtÄ«bas, nevis absolÅ«to vÄrtÄ«bu. TÄpÄc, rediÄ£Äjot noteiktus baitus, tiek mainÄ«ta visu pÄrÄjo pikseļu krÄsa. PiemÄram, glabÄÅ”anas vietÄ
12 13 14 14 14 13 13 14
MÄs varÄtu sÄkt ar 12 un tad vienkÄrÅ”i norÄdÄ«t, cik daudz mums jÄsaskaita vai jÄatÅem, lai iegÅ«tu nÄkamo skaitli. Un Ŕī secÄ«ba delta kodÄÅ”anÄ izpaužas Å”ÄdÄ formÄ:
12 1 1 0 0 -1 0 1
KonvertÄtie dati nav mazÄki par sÄkotnÄjiem datiem, taÄu tos ir vieglÄk saspiest. Delta kodÄjuma lietoÅ”ana pirms darbÄ«bas ilguma kodÄÅ”anas var ievÄrojami palÄ«dzÄt, vienlaikus saglabÄjot bezzudumu saspieÅ”anu.
Delta kodÄÅ”ana ir viena no nedaudzajÄm metodÄm, ko izmanto Ärpus 8x8 blokiem. No 64 DCT koeficientiem viens ir vienkÄrÅ”i nemainÄ«ga viļÅa funkcija (vienkrÄsaina). Tas atspoguļo katra bloka vidÄjo spilgtumu luma komponentiem vai vidÄjo zilumu Cb komponentiem utt. Katra DCT bloka pirmo vÄrtÄ«bu sauc par lÄ«dzstrÄvas vÄrtÄ«bu, un katra lÄ«dzstrÄvas vÄrtÄ«ba ir delta kodÄta attiecÄ«bÄ pret iepriekÅ”ÄjÄm. TÄpÄc pirmÄ bloka spilgtuma maiÅa ietekmÄs visus blokus.
PÄdÄjais noslÄpums paliek: kÄ vienskaitļa maiÅa pilnÄ«bÄ sabojÄ visu attÄlu? LÄ«dz Å”im kompresijas lÄ«meÅiem Å”Ädas Ä«paŔības nebija. Atbilde ir JPEG galvenÄ. Pirmie 500 baiti satur metadatus par attÄlu ā platumu, augstumu utt., un mÄs ar tiem vÄl neesam strÄdÄjuÅ”i.
Bez galvenes ir gandrÄ«z neiespÄjami (vai ļoti grÅ«ti) atÅ”ifrÄt JPEG. Å Ä·iet, ka es mÄÄ£inÄtu jums aprakstÄ«t attÄlu, un es sÄku izdomÄt vÄrdus, lai nodotu savu iespaidu. IespÄjams, apraksts bÅ«s diezgan saÄ«sinÄts, jo es varu izdomÄt vÄrdus ar tieÅ”i tÄdu nozÄ«mi, kÄdu vÄlos nodot, bet visiem pÄrÄjiem tie nebÅ«s jÄgas.
Tas izklausÄs muļķīgi, bet tieÅ”i tÄ notiek. Katrs JPEG attÄls tiek saspiests ar tam raksturÄ«giem kodiem. Kodu vÄrdnÄ«ca tiek saglabÄta galvenÄ. Å o paÅÄmienu sauc par Hafmena kodu, un vÄrdu krÄjumu sauc par Hafmana tabulu. GalvenÄ tabula ir atzÄ«mÄta ar diviem baitiem - 255 un pÄc tam 196. Katrai krÄsu sastÄvdaļai var bÅ«t sava tabula.
Tabulu izmaiÅas radikÄli ietekmÄs jebkuru attÄlu. Labs piemÄrs ir mainÄ«t 15. rindiÅu uz 1.
Tas notiek tÄpÄc, ka tabulÄs ir norÄdÄ«ts, kÄ atseviŔķi biti jÄlasa. LÄ«dz Å”im mÄs esam strÄdÄjuÅ”i tikai ar binÄrajiem skaitļiem decimÄldaļÄ. Bet tas slÄpj no mums to, ka, ja vÄlaties baitÄ saglabÄt skaitli 1, tas izskatÄ«sies kÄ 00000001, jo katram baitam jÄbÅ«t tieÅ”i astoÅiem bitiem, pat ja nepiecieÅ”ams tikai viens no tiem.
Ja jums ir daudz mazu skaitļu, tas, iespÄjams, ir liels vietas izŔķieÅ”ana. Huffman kods ir paÅÄmiens, kas ļauj atvieglot Å”o prasÄ«bu, ka katram skaitlim ir jÄaizÅem astoÅi biti. Tas nozÄ«mÄ, ka, ja redzat divus baitus:
234 115
Tad atkarÄ«bÄ no Huffman tabulas tie varÄtu bÅ«t trÄ«s skaitļi. Lai tos iegÅ«tu, vispirms tie jÄsadala atseviŔķos bitos:
11101010 01110011
Tad mÄs skatÄmies uz tabulu, lai saprastu, kÄ tos grupÄt. PiemÄram, tie varÄtu bÅ«t pirmie seÅ”i biti (111010) vai 58 decimÄldaļÄs, kam seko pieci biti (10011) vai 19 un visbeidzot pÄdÄjie Äetri biti (0011) vai 3.
TÄpÄc Å”ajÄ saspieÅ”anas posmÄ ir ļoti grÅ«ti saprast baitus. Baiti neatspoguļo to, kas Ŕķiet. Å ajÄ rakstÄ es neiedziļinÄÅ”os detaļÄs par darbu ar tabulu, bet materiÄli par Å”o jautÄjumu tieÅ”saistÄ ir pietiekams.
Viens interesants triks, ko varat veikt, izmantojot Ŕīs zinÄÅ”anas, ir atdalÄ«t galveni no JPEG un saglabÄt to atseviŔķi. Faktiski izrÄdÄs, ka tikai jÅ«s varat lasÄ«t failu. Facebook to dara, lai padarÄ«tu failus vÄl mazÄkus.
Ko vÄl var izdarÄ«t, ir diezgan nedaudz mainÄ«t Huffman tabulu. Citiem tas izskatÄ«sies pÄc salauztas bildes. Un tikai jÅ«s zinÄt maÄ£isko veidu, kÄ to novÄrst.
Apkoposim: kas ir nepiecieÅ”ams JPEG atÅ”ifrÄÅ”anai? NepiecieÅ”ams:
IzÅemiet Huffman tabulu(-as) no galvenes un atÅ”ifrÄjiet bitus.
IzÅemiet diskrÄtos kosinusa pÄrveidoÅ”anas koeficientus katrai krÄsas un spilgtuma komponentei katram 8x8 blokam, veicot apgrieztas darbÄ«bas garuma un delta kodÄÅ”anas transformÄcijas.
Apvienojiet kosinusus, pamatojoties uz koeficientiem, lai iegÅ«tu pikseļu vÄrtÄ«bas katram 8x8 blokam.
MÄrogojiet krÄsu komponentus, ja tika veikta apakÅ”izlase (Ŕī informÄcija ir galvenÄ).
KonvertÄjiet iegÅ«tÄs YCbCr vÄrtÄ«bas katram pikselim uz RGB.
ParÄdiet attÄlu uz ekrÄna!
Nopietns darbs, lai vienkÄrÅ”i noskatÄ«tos fotoattÄlu ar kaÄ·i! TomÄr man tajÄ patÄ«k tas, ka tas parÄda, cik JPEG tehnoloÄ£ija ir vÄrsta uz cilvÄku. Tas ir balstÄ«ts uz mÅ«su uztveres Ä«patnÄ«bÄm, ļaujot sasniegt daudz labÄku kompresiju nekÄ parastÄs tehnoloÄ£ijas. Un tagad, kad mÄs saprotam, kÄ darbojas JPEG, mÄs varam iedomÄties, kÄ Å”Ä«s tehnoloÄ£ijas var pÄrnest uz citÄm jomÄm. PiemÄram, delta kodÄjums video var ievÄrojami samazinÄt faila lielumu, jo bieži vien ir veseli apgabali, kas nemainÄs no kadra uz otru (piemÄram, fons).
RakstÄ izmantotais kods, ir atvÄrts, un tajÄ ir norÄdÄ«jumi par to, kÄ attÄlus aizstÄt ar saviem.