JPEG formÄta attÄli ir sastopami visur mÅ«su digitÄlajÄ dzÄ«vÄ, taÄu aiz Ŕī izpratnes slÄÅa slÄpjas algoritmi, kuri izslÄdz cilvÄka acÄ«m neredzamos detaļas. RezultÄtÄ tiek panÄkta visaugstÄkÄ vizuÄlÄ kvalitÄte ar minimÄlo faila lielumu ā bet kÄ tieÅ”i tas viss darbojas? ApskatÄ«sim, ko tieÅ”i mÅ«su acis neredz!

Ir viegli pieÅemt, ka iespÄjams nosÅ«tÄ«t fotogrÄfiju draugam, nesatraucoties par to, kuru ierÄ«ci, pÄrlÅ«kprogrammu vai operÄtÄjsistÄmu viÅÅ” izmanto ā taÄu tÄ nebija vienmÄr. 1980. gadu sÄkumÄ datoriem bija spÄjas glabÄt un rÄdÄ«t digitÄlos attÄlus, tomÄr labÄkais veids, kÄ to izdarÄ«t, radÄ«ja daudz konkurÄjoÅ”u ideju. Nebija iespÄjams vienkÄrÅ”i nosÅ«tÄ«t attÄlu no viena datora uz citu un cerÄt, ka viss darbosies.
Lai atrisinÄtu Å”o problÄmu, 1986. gadÄ tika izveidota ekspertu komiteja no visas pasaules ar nosaukumu āā (Joint Photographic Experts Group, JPEG), kas tika izveidota starptautiskÄs standartizÄcijas organizÄcijas (ISO) un StarptaustiskÄs elektrotehniskÄs komisijas (IEC) kopÄ«gÄ darbÄ ā divÄs starptautiskÄs standartizÄcijas organizÄcijÄs, kuru centrs atrodas ŽenÄvÄ (Å veicÄ).
JPEG grupas cilvÄki izveidoja JPEG digitÄlo attÄlu saspieÅ”anas standartu 1992. gadÄ. Ikviens, kurÅ” ir lietojis internetu, visticamÄk, ir saskÄries ar JPEG kodÄtiem attÄliem. Tas ir visizplatÄ«tÄkais attÄlu kodÄÅ”anas, nosÅ«tīŔanas un glabÄÅ”anas veids. No tÄ«mekļa lapÄm lÄ«dz e-pastiem un sociÄlajiem tÄ«kliem, JPEG tiek izmantots miljardiem reižu dienÄ ā praktiski katru reizi, kad skatÄmies attÄlu tieÅ”saistÄ vai to sÅ«tÄm. Bez JPEG tÄ«meklis bÅ«tu mazÄk krÄsains, lÄnÄks, un, iespÄjams, tajÄ bÅ«tu mazÄk kaÄ·u fotogrÄfiju!
Å is raksts ir par to, kÄ dekodÄt JPEG attÄlu. Citiem vÄrdiem sakot, tas attiecas uz to, kas nepiecieÅ”ams, lai pÄrveidotu datorsistÄmÄ glabÄtos saspiestos datus par attÄlu, kas parÄdÄs ekrÄnÄ. Par to jÄzina ne tikai tÄpÄc, ka tas ir bÅ«tiski, lai labÄk izprastu tehnoloÄ£iju, ko mÄs lietojam katru dienu, bet arÄ« tÄpÄc, ka, atklÄjot saspieÅ”anas lÄ«meÅus, mÄs labÄk iepazÄ«stam uztveri un redzi, kÄ arÄ« to, uz kuriem sÄ«kumiem mÅ«su acis ir visjutÄ«gÄkÄs.
TurklÄt spÄlÄties ar attÄliem Å”ÄdÄ veidÄ ir ļoti interesanti.

Ieskats JPEG iekÅ”ienÄ
DatorÄ viss tiek glabÄts kÄ secÄ«ba binÄro ciparu. Parasti Å”ie biti, nulles un vieninieki, tiek grupÄti pa astoÅiem, veidojot baitus. Kad jÅ«s atverat JPEG attÄlu datorÄ, kaut kas (pÄrlÅ«ks, operÄtÄjsistÄma, vÄl kas) ir jÄdekodÄ baitiem, atjaunojot sÄkotnÄjo attÄlu kÄ krÄsu sarakstu, ko var parÄdÄ«t.
Ja jÅ«s lejupielÄdÄjat Å”o jauko un atverat to teksta redaktorÄ, jÅ«s ieraudzÄ«siet virkni nesakarÄ«gu simbolu.

Å eit es izmantoju Notepad++, lai izpÄtÄ«tu faila saturu, jo parastie teksta redaktori, piemÄram, Windows Notepad, sabojÄs binÄro failu pÄc saglabÄÅ”anas, un tas vairs neatbilst JPEG formÄtam.
Atverot attÄlu teksta redaktorÄ, jÅ«s sajaucat datoru tÄpat kÄ jÅ«su smadzenes, kad jÅ«s berzÄjat acis un sÄkat redzÄt krÄsainus plankumus!
Å ie plankumi, ko jÅ«s redzat, ir pazÄ«stami kÄ , un nav gaismas stimulu vai sapÅu radÄ«tu halucinÄciju rezultÄts. Tie rodas, jo jÅ«su smadzenes uzskata, ka jebkÄdi elektriskie signÄli acs nervos nodod informÄciju par gaismu. SmadzenÄm ir jÄveic Å”Ädi pieÅÄmumi, jo nav iespÄjams noteikt, vai signÄls ir skaÅa, redzÄjums vai kaut kas cits. Visi nervi Ä·ermenÄ« nodod pilnÄ«gi identiskus elektriskos impulsus. Spiežot uz acÄ«m, jÅ«s sÅ«tÄt neskaidrus signÄlus, kas aktivizÄ acs receptorus, ko jÅ«su smadzenes interpretÄ ā Å”ajÄ gadÄ«jumÄ nepareizi ā kÄ kaut ko redzamu. JÅ«s burtiski spÄjat redzÄt spiedienu!
Ir ironiÄ·i domÄt par to, cik datori ir lÄ«dzÄ«gi smadzenÄm, taÄu tÄ ir arÄ« noderÄ«ga analogija, kas ilustrÄ, cik ļoti datu nozÄ«me ā pÄrvadÄjamÄ caur nervu sistÄmu vai uzglabÄta datorÄ ā atkarÄ«ga no to interpretÄcijas. Visi binÄrie dati sastÄv no nullÄm un viendabÄ«bÄm, pamatelementiem, kas spÄj nodot jebkÄda veida informÄciju. JÅ«su dators bieži vien uzmin, kÄ tos interpretÄt, izmantojot norÄdes, piemÄram, failu paplaÅ”inÄjumus. Un tagad mÄs liekam tam interpretÄt tos kÄ tekstu, jo tieÅ”i to sagaida teksta redaktors.
Lai saprastu, kÄ dekodÄt JPEG, mums jÄredz paÅ”i sÄkotnÄjie signÄli ā binÄrie dati. To var izdarÄ«t, izmantojot heksadecimÄlo redaktoru, vai tieÅ”i uz ! Tur ir attÄls, blakus kuram tekstlaukÄ ir visi tÄ baļķi (izÅemot virsrakstu), kas attÄloti desmitiÅ”Ä·Ä formÄ. JÅ«s varat tos mainÄ«t, un skripts pÄrkodÄ un nodroÅ”ina jaunu attÄlu Ätri.

Var daudz ko uzzinÄt, vienkÄrÅ”i spÄlÄjoties ar Å”o redaktoru. PiemÄram, vai varat pateikt, kÄdÄ secÄ«bÄ tiek uzglabÄti pikseļi?
Å ajÄ piemÄrÄ dÄ«vainÄ lieta ir tÄ, ka dažu numuru maiÅa vispÄr neietekmÄ attÄlu, bet, piemÄram, ja pirmÄjÄ rindÄ nomainÄt numuru 17 uz 0, attÄls pilnÄ«bÄ sabojÄs!

Citi mainÄ«jumi, piemÄram, 7 maiÅa 1988. rindÄ uz numuru 254 maina krÄsu, bet tikai sekojoÅ”iem pikseļiem.

IespÄjams, dÄ«vainÄkais ir tas, ka daži numuri maina ne tikai krÄsu, bet arÄ« attÄla formu. Nomainiet 70 12. rindÄ uz 2 un skatieties augÅ”Äjo rindu attÄlÄ, lai redzÄtu, ko domÄju.

Un neatkarÄ«gi no tÄ, kuru JPEG attÄlu izmantojat, jÅ«s vienmÄr atradÄ«siet Ŕīs noslÄpumainÄs Å”aha secÄ«bas, rediÄ£Äjot baitus.
SpÄlÄjoties ar redaktoru, grÅ«ti saprast, kÄ attÄls tiek atjaunots no Å”iem baitiem, jo JPEG saspieÅ”anas process sastÄv no trim dažÄdÄm tehnoloÄ£ijÄm, kas tiek piemÄrotas secÄ«gi pa lÄ«meÅiem. MÄs katru no tÄm pÄtot atseviŔķi, lai atklÄtu novÄroto noslÄpumaino uzvedÄ«bu.
TrÄ«s JPEG saspieÅ”anas lÄ«meÅi:
- .
- .
- , un
Lai jÅ«s varÄtu iztÄloties saspieÅ”anas apmÄrus, lÅ«dzu, Åemiet vÄrÄ, ka iepriekÅ” minÄtÄ attÄlÄ ir 79 819 skaitļu, tas ir, aptuveni 79 kB. Ja mÄs to saglabÄtu nesaspiestÄ veidÄ, katram pikselim bÅ«tu nepiecieÅ”ami trÄ«s skaitļi ā sarkanajai, zaļajai un zilajai komponentei. Tas bÅ«tu 917 700 skaitļu, jeb apmÄram 917 kB. JPEG saspieÅ”anas rezultÄtÄ gala fails ir samazinÄjies vairÄk nekÄ 10 reizes!
PatiesÄ«bÄ Å”o attÄlu var saspiest daudz spÄcÄ«gÄk. ZemÄk ir divi attÄli blakus ā attÄls pa labi ir saspiests lÄ«dz 16 kB, tas ir 57 reizes mazÄk nekÄ nesaspiestÄ versija!

Ja paskatÄties tuvÄk, bÅ«s redzams, ka Å”ie attÄli nav identiski. Abi ir JPEG saspieÅ”anas attÄli, tomÄr labÄ ir daudz mazÄka izmÄrÄ. TÄ arÄ« izskatÄs nedaudz sliktÄk (paskatieties uz fona krÄsu kvadrÄtiem). TÄdÄļ JPEG dÄvÄ arÄ« par saspieÅ”anu ar zaudÄjumiem; saspieÅ”anas procesÄ attÄls mainÄs un zaudÄ dažas detaļas.
1. KrÄsu subdiskrÄcija
Å eit ir attÄls, kurÄ tiek izmantots tikai pirmais saspieÅ”anas lÄ«menis.

(InteraktÄ«vÄ versija ā oriÄ£inÄlÄ Tagad skaitļus ir nedaudz vieglÄk atÅ”ifrÄt. Tas ir gandrÄ«z vienkÄrÅ”s krÄsu saraksts, kur katrs baits maina tieÅ”i vienu pikseli, bet tas jau ir divas reizes mazÄks nekÄ nesaspiestais attÄls (kurÅ” ieÅemtu apmÄram 300 kB Å”ÄdÄ samazinÄtÄ izmÄrÄ). Vai varat uzminÄt, kÄpÄc?
Ir redzams, ka Å”ie skaitļi nenozÄ«mÄ standartkrÄsu sarkano, zaļo un zilo komponentes, jo, ja nomainÄ«tu visus skaitļus uz nullÄm, mÄs iegÅ«tu zaļu attÄlu (nevis baltu).
Tas ir tÄpÄc, ka Å”ie baitīŔi apzÄ«mÄ Y (spÄ«dumu),

Cb (proporcionÄlo zilgnumu),

un Cr (proporcionÄlo sarkanumu) attÄlÄ.

KÄpÄc nelietot RGB? Galu galÄ tieÅ”i tÄ darbojas lielÄkÄ daļa moderno ekrÄnu. JÅ«su monitors var parÄdÄ«t jebkuru krÄsu, tostarp sarkano, zaļo un zilo krÄsu ar atŔķirÄ«gu intensitÄti katram pikselim. Balts iegÅ«st, ieslÄdzot visus trÄ«s pilnÄ spožumÄ, bet melns ā tos izslÄdzot.

Tas ir arÄ« ļoti lÄ«dzÄ«gi cilvÄka acs darbÄ«bai. KrÄsu receptori mÅ«su acÄ«s tiek saukti par ā

konusiemĀ«, un tiek iedalÄ«ti trijos tipos, no kuriem katrs ir jÅ«tÄ«gÄks pret sarkano, zaļo vai zilo krÄsu [S tips ir jutÄ«gs violeti-zilajÄ (S no angļu valodas Short ā Ä«sviļÅu spektrÄ), M tips ā zaļgani dzeltenajÄ (M no angļu valodas Medium ā vidÄji viļÅu), un L tips ā dzeltenÄ«gi sarkanajÄ (L no angļu valodas Long ā garÅ”viļÅu) spektra daļÄ. Å o trÄ«s veidu konusi (un stieÅi, kas ir jutÄ«gi smaragda zaļajÄ spektrÄ) klÄtbÅ«tne nodroÅ”ina cilvÄka krÄsu redzi. / komentÄrs pÄrtulkots]. , cits fotor receptoru veids mÅ«su acÄ«s, spÄj uztvert izmaiÅas spilgtumÄ, tomÄr ir daudz jÅ«tÄ«gÄks pret krÄsu. MÅ«su acÄ«s ir apmÄram 120 miljoni stieÅu un tikai 6 miljoni konusi.
TÄpÄc mÅ«su acis daudz labÄk pamanÄs izmaiÅas spilgtumÄ, nekÄ izmaiÅas krÄsÄ. Ja atdalÄm krÄsu no spilgtuma, varam nedaudz noÅemt krÄsu, un neviens to nemanÄ«s. KrÄsu subdiskretizÄcija ā tas ir process, kas attÄla krÄsu komponentus attÄlo mazÄkÄ izŔķirtspÄjÄ salÄ«dzinÄjumÄ ar spilgtuma komponentiem. IepriekÅ” minÄtajÄ piemÄrÄ katram pikselim ir tieÅ”i viena Y komponente, bet katrai atseviŔķai Äetru pikseļu grupai ir tieÅ”i viena Cb un viena Cr komponente. TÄpÄc attÄls satur Äetras reizes mazÄk krÄsu informÄcijas, nekÄ oriÄ£inÄls.
KrÄsu telpa YCbCr tiek izmantota ne tikai JPEG. TÄ tika izstrÄdÄta jau 1938. gadÄ televÄ«zijai. Ne visiem ir krÄsains televizors, tÄpÄc krÄsas un spilgtuma atdalīŔana ļÄva visiem saÅemt to paÅ”u signÄlu, bet krÄsu trÅ«kumi tikai izmantoja spilgtuma komponentu.
TÄpÄc vienas skaitļa dzÄÅ”ana redaktorÄ pilnÄ«bÄ sagrauj visus krÄsas. Komponentes tiek glabÄtas Y Y Y Y Cb Cr veidÄ (patiesÄ«bÄ, tas nav obligÄti Å”ÄdÄ secÄ«bÄ ā glabÄÅ”anas secÄ«bu nosaka faila galvenÄ). PirmajÄ skaitļa dzÄÅ”ana novedÄ«s pie tÄ, ka pirmais Cb vÄrtÄ«ba tiks uztverta kÄ Y, Cr kÄ Cb, un vispÄrÄju rezultÄtu iegÅ«st domino efekts, kas maina visas attÄla krÄsas.
JPEG specifikÄcija nenosaka, ka jums bÅ«tu jÄizmanto YCbCr. TomÄr lielÄkajÄ daÄ¼Ä failu tÄ tiek izmantota, jo tÄ nodroÅ”ina labÄku attÄlu kvalitÄti pÄc subdiskrÄcijas salÄ«dzinÄjumÄ ar RGB. Bet jums nav jÄpÄrliecinÄs par to vienkÄrÅ”i manu vÄrdu dÄļ. Apskatiet paÅ”i tabulÄ zemÄk, kÄ katra atseviÅ”Ä·Ä komponenta subdiskrÄcija izskatÄ«sies gan RGB, gan YCbCr.

(InteraktÄ«vÄ versija ā oriÄ£inÄlÄ raksti).
Zils noÅemÅ”ana nav tik pamanÄma kÄ sarkana vai zaļa. Tas saistÄ«ts ar to, ka no seÅ”iem miljoniem konusi jÅ«su acÄ«s aptuveni 64% ir jutÄ«gi pret sarkano, 32% pret zaļo un 2% pret zilo.
Y komponentes subdiskrÄcija (pa kreisi apakÅ”Ä) ir vispamanÄmÄkÄ. Pat nelielas izmaiÅas ir redzamas.
AttÄla pÄrvÄrÅ”ana no RGB uz YCbCr nesamazina faila lielumu, bet atvieglo mazÄk pamanÄmu detaļu meklÄÅ”anu, kuras var izdzÄst. Zudumu kompresija notiek otrajÄ posmÄ. TÄs pamatÄ ir ideja attÄlot datus kompresÄjamÄkÄ veidÄ.
2. DiskrÄtÄ kosinusa transformÄcija un diskrÄcija
Å is kompresijas lÄ«menis lielÄ mÄrÄ nosaka JPEG bÅ«tÄ«bu. PÄc krÄsu pÄrvÄrÅ”anas uz YCbCr komponentes tiek saspiestas atseviŔķi, tÄpÄc mÄs varam koncentrÄties tikai uz Y komponenti. Un lÅ«k, kÄ Y komponentes baitus izskatÄs pÄc Ŕī lÄ«meÅa piemÄroÅ”anas.

(InteraktÄ«vÄ versija ā oriÄ£inÄlÄ raksti). InteraktÄ«vajÄ versijÄ klikŔķis uz pikseļa ritina redaktoru uz rindu, kas to apzÄ«mÄ. MÄÄ£iniet izdzÄst skaitļus galÄ vai pievienot dažus nulles noteiktam skaitlim.
PirmajÄ mirklÄ« Ŕķiet, ka tas ir ļoti slikta kompresija. AttÄlÄ ir 100 000 pikseļu, un, lai apzÄ«mÄtu to spilgtumu (Y komponentes), ir nepiecieÅ”ami 102 400 skaitļu ā tas ir sliktÄk nekÄ nekÄdÄ veidÄ nespiesties!
TomÄr Åemiet vÄrÄ, ka lielÄkÄ daļa Å”o skaitļu ir vienÄdi ar nulli. VairÄk nekÄ tas, visi Å”ie nulli rindas beigÄs var tikt izdzÄsti, nemainot attÄlu. Paliek apmÄram 26 000 skaitļu, un tas jau ir gandrÄ«z Äetras reizes mazÄk!
Å ajÄ lÄ«menÄ« ir noslÄpums Å”aha rakstos. AtŔķirÄ«bÄ no citiem efektiem, kurus esam redzÄjuÅ”i, Å”o rakstu parÄdīŔanÄs nav kļūdas. Tie ir visu attÄlu bÅ«vblokki. Katru redaktora rindu aizÅem tieÅ”i 64 skaitļi, diskrÄtÄs kosinusa transformÄcijas (DCT) koeficienti, kas atbilst 64 unikÄlu rakstu intensitÄtÄm.
Šie raksti veidojas, pamatojoties uz kosinusa grafiku. Šeit ir daži no tiem:

8 no 64 koeficientiem
ZemÄk ir attÄls, kas parÄda visus 64 rakstus.

(InteraktÄ«vÄ versija ā oriÄ£inÄlÄ raksti).
Å ie raksti ir Ä«paÅ”i svarÄ«gi, jo tie veido 8x8 izmÄra attÄlu pamatu. Ja neesi pazÄ«stams ar lineÄro algebru, tas nozÄ«mÄ, ka jebkuru 8x8 izmÄra attÄlu var iegÅ«t no Å”iem 64 rakstiem. DCT ir process, kas sadala attÄlus 8x8 blokos un pÄrveido katru bloku par Å”o 64 koeficientu kombinÄciju.
Tas, ka jebkuru attÄlu var sastÄdÄ«t no 64 noteiktiem rakstiem, Ŕķiet kÄ burvÄ«ba. TomÄr tas ir tas pats, kas teikt, ka jebkuru vietu uz Zemes var aprakstÄ«t ar divÄm skaitļiem ā platumu un garumu [norÄdot puslodes / piezÄ«me tulkotÄjam]. MÄs bieži uzskatÄm, ka Zemes virsma ir divdimensionÄla, tÄpÄc mums nepiecieÅ”ami tikai divi skaitļi. AttÄls 8x8 ir 64 dimensijas, tÄpÄc mums nepiecieÅ”ami 64 skaitļi.
VÄl nav skaidrs, kÄ tas palÄ«dzÄjis kompresijas ziÅÄ. Ja mums nepiecieÅ”ami 64 skaitļi, lai attÄlotu 8x8 attÄlu, kÄpÄc Ŕī metode bÅ«tu labÄka par vienkÄrÅ”u 64 spilgtuma komponentu glabÄÅ”anu? MÄs to darÄm tÄpÄc, ka mÄs pÄrveidojÄm trÄ«s RGB skaitļus par trim YCbCr skaitļiem: tas ļauj mums izÅemt nemanÄmÄs detaļas.
GrÅ«ti redzÄt, kuras tieÅ”i detaļas tiek izÅemtas Å”ajÄ posmÄ, jo JPEG pielieto DCT 8x8 blokiem. TomÄr neviens mums neierobežo to pielietot visam attÄlam. LÅ«k, kÄ DCT izskatÄs Y komponentÄ, piemÄrojot to visam attÄlam:

No beigÄm var izÅemt vairÄk nekÄ 60 000 skaitļu praktiski bez manÄm izmaiÅÄm attÄlÄ.

TomÄr Åemiet vÄrÄ, ka, ja mÄs nullificÄsim pirmos piecus skaitļus, atŔķirÄ«ba bÅ«s acÄ«mredzama.

PirmajÄ rindÄ esoÅ”ie skaitļi norÄda uz zemas frekvences izmaiÅÄm attÄlÄ, un mÅ«su acis tos uztver vislabÄk. Beigu daÄ¼Ä esoÅ”ie skaitļi norÄda uz augstas frekvences izmaiÅÄm, kuras ir grÅ«tÄk pamanÄ«t. Lai āredzÄtu to, ko acs neredzā, mÄs varam izolÄt Ŕīs augstas frekvences detaļas, nullificÄjot pirmos 5000 skaitļus.

MÄs redzam visas attÄla zonas, kurÄs notiek vislielÄkÄs izmaiÅas no pikseļa uz pikseļa. Izceļas kaÄ·a acis, viÅa Å«sas, kažokÄdas sega un Änas kreisajÄ apakÅ”ÄjÄ stÅ«rÄ«. Varam iet tÄlÄk, nullificÄjot pirmos 10 000 skaitļus:

20 000:

40 000:

60 000:

Å ie augstas frekvences JPEG elementi tiek noÅemti kompresijas posmÄ. KrÄsu pÄrveidoÅ”ana DCT koeficientos nesniedz zaudÄjumus. ZaudÄjumi rodas diskretizÄcijas posmÄ, kur tiek dzÄsti augstas frekvences vai tuvu nulles vÄrtÄ«bas. Kad samazinÄt JPEG saglabÄÅ”anas kvalitÄti, programma palielina dzÄsto vÄrtÄ«bu slieksni, kas samazina faila izmÄru, bet padara attÄlu vairÄk pikselizÄtu. TÄpÄc attÄls pirmajÄ sadaļÄ, kas bija 57 reizes mazÄks, izskatÄ«jÄs tÄds. Katrs 8x8 bloks tika attÄlots ar daudz mazÄk DCT koeficientiem salÄ«dzinÄjumÄ ar kvalitatÄ«vÄku versiju.
Vai var radÄ«t jauku efektu, piemÄram, pakÄpenisku attÄlu straumÄÅ”anu. Var parÄdÄ«t izplÅ«duÅ”u attÄlu, kas kļūst arvien detalizÄtÄks, lejupielÄdÄjot aizvien vairÄk koeficientu.
Å eit ir, vienkÄrÅ”i ziÅkÄrÄ«bas pÄc, kas notiks, ja tiks izmantoti tikai 24 000 skaitļu:

Vai arī tikai 5000:

Ä»oti izplÅ«dis, bet it kÄ atpazÄ«stams!
3. Garuma kodÄÅ”ana, delta un Hafmana
LÄ«dz Å”im visi sasprindzinÄjuma posmi bija ar zaudÄjumiem. PÄdÄjais posms, gluži pretÄji, notiek bez zaudÄjumiem. Tas nezina informÄciju, taÄu ievÄrojami samazina faila izmÄru.
KÄ var saspiest kaut ko, neizmetot informÄciju? IedomÄjieties, kÄ mÄs aprakstÄ«tu vienkÄrÅ”u melnu taisnstÅ«ri 700 x 437.
JPEG izmanto Å”im 5000 skaitļu, bet var sasniegt daudz labÄkus rezultÄtus. Vai varat iedomÄties kodÄÅ”anas shÄmu, kas aprakstÄ«tu lÄ«dzÄ«gu attÄlu ar pÄc iespÄjas mazÄku baitÄ skaitu?
MinimÄlÄ shÄma, kuru esmu spÄjis izdomÄt, izmanto Äetrus: trÄ«s krÄsas apzÄ«mÄÅ”anai, un ceturtais ā cik pikseļu ir ar tÄdu krÄsu. Ideja par atkÄrtotu vÄrtÄ«bu attÄloÅ”anu Å”ÄdÄ kompresÄtÄ veidÄ tiek dÄvÄta par garuma kodÄÅ”anu. TÄ ir bez zaudÄjumiem, jo mÄs varam atjaunot kodÄt datos sÄkotnÄjÄ formÄ.
JPEG faila izmÄrs 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 nepiecieÅ”ams vismaz viens DCT koeficients katriem 64 pikseļiem. Vienu mums vajag, jo, nevis glabÄjot vienu DCT koeficientu, kam seko 63 nulles, garo secÄ«bu kodÄÅ”ana ļauj mums uzglabÄt vienu skaitli un norÄdÄ«t, ka āvisi pÄrÄjie ir nullesā.
Delta kodÄÅ”ana ir tehnika, kurÄ katrs baits satur atŔķirÄ«bu no kÄdas vÄrtÄ«bas, nevis absolÅ«tu lielumu. TÄdÄjÄdi noteiktu baitus rediÄ£Äjot, tiek mainÄ«ts visu citu pikseļu krÄsa. PiemÄram, nevis glabÄjot
12 13 14 14 14 13 13 14
MÄs varÄtu sÄkt ar 12, bet pÄc tam vienkÄrÅ”i norÄdÄ«t, cik daudz jÄpieadding vai jÄatÅem, lai iegÅ«tu nÄkamo skaitli. Un Ŕī secÄ«ba delta kodÄÅ”anÄ izskatÄs Å”Ädi:
12 1 1 0 0 -1 0 1
PÄrveidotie dati nav mazÄki par sÄkotnÄjiem, bet saspieÅ”ana ir vieglÄka. Delta kodÄÅ”anas lietoÅ”ana pirms garo secÄ«bu kodÄÅ”anas var bÅ«t bÅ«tiska palÄ«dzÄ«ba, paliekot pie bezzaudÄjumu saspieÅ”anas.
Delta kodÄÅ”ana ir viena no nedaudzajÄm tehnikÄm, kuras tiek pielietotas Ärpus 8x8 blokiem. No 64 DCT koeficientiem viens ā vienkÄrÅ”i ir nemainÄ«ga vilnis funkcija (viendabÄ«ga krÄsa). Tas pÄrstÄv katra bloka vidÄjo spilgtumu luminansa komponentiem, vai vidÄjo zilo komponentu Cb un tÄ tÄlÄk. Pirmais katra DCT bloka vÄrtÄ«ba tiek saukta par DC vÄrtÄ«bu, un katra DC vÄrtÄ«ba tiek delta kodÄta attiecÄ«bÄ pret iepriekÅ”ÄjÄm. TÄdÄjÄdi pirmÄ bloka spilgtuma izmaiÅas ietekmÄ visus blokos.
Paliek pÄdÄjÄ mÄ«kla: kÄ viena skaitļa maiÅa pilnÄ«bÄ sabojÄ visu attÄlu? LÄ«dz Å”im saspieÅ”anas lÄ«meÅiem nebija Å”Ädu Ä«paŔību. Atbilde slÄpjas JPEG virsrakstÄ. Pirmie 500 baitus satur metadatus par attÄlu ā platumu, augstumu un citu informÄciju, un, kamÄr mÄs ar tiem neesam strÄdÄjuÅ”i.
Bez virsraksta gandrÄ«z nav iespÄjams (nu, vai vismaz ļoti grÅ«ti) atÅ”ifrÄt JPEG. Tas izskatÄ«tos tÄ, it kÄ es mÄÄ£inÄtu aprakstÄ«t jums gleznu, un sÄku izdomÄt vÄrdus, lai nodotu savas izjÅ«tas. Apraksts, visticamÄk, bÅ«s ļoti saspringts, jo es varu izdomÄt vÄrdus tieÅ”i ar to nozÄ«mi, ko vÄlos nodot, taÄu visiem pÄrÄjiem tie nebÅ«s saprotami.
Tas izklausÄs muļķīgi, bet tieÅ”i tÄ tas notiek. Katrs JPEG attÄls tiek saspiests ar kodiem, kas ir specifiski tieÅ”i tam. Kodu vÄrdnÄ«ca tiek glabÄta virsrakstÄ. Å Ä« tehnika tiek saukta par 'Hafmana kodu', bet vÄrdnÄ«ca ā par Hafmana tabulu. VirsrakstÄ tabula ir marÄ·Äta ar diviem baitiem ā 255 un pÄc tam 196. Katram krÄsu komponentam var bÅ«t sava tabula.
IzmaiÅas tabulÄs radikÄli ietekmÄs jebkuru attÄlu. Labs piemÄrs ir nomainÄ«t 1 uz 12 15. rindÄ.

Tas notiek tÄpÄc, ka tabulÄs tiek norÄdÄ«ts, kÄ jÄizlasa atseviŔķi biti. LÄ«dz Å”im mÄs strÄdÄjÄm tikai ar binÄrajiem skaitļiem desmitnieku formÄtÄ. Bet tas slÄpj no mums to faktu, ka, ja vÄlaties saglabÄt skaitli 1 baitÄ, tam bÅ«s jÄizskatÄs kÄ 00000001, jo katrÄ baitÄ ir precÄ«zi astoÅi biti, pat ja no tiem nepiecieÅ”ams tikai viens.
PotenciÄli tas ir liels vietas zudums, ja jums ir daudz mazu skaitļu. Hafmana kods ir tehnika, kas ļauj mums mazinÄt Å”o prasÄ«bu, ka katram skaitlim jÄaizÅem astoÅi biti. Tas nozÄ«mÄ, ka, ja redzat divus baitus:
234 115
Tad, atkarÄ«bÄ no Hafmana tabulas, tie var bÅ«t trÄ«s skaitļi. Lai tos izvilktu, jums vispirms jÄsadala tie atseviŔķos bitos:
11101010 01110011
PÄc tam mÄs skatÄmies tabulÄ, lai saprastu, kÄ tos grupÄt. PiemÄram, tie var bÅ«t pirmie seÅ”i biti (111010), vai 58 desmitnieku sistÄmÄ, kam seko pieci biti (10011), vai 19, un visbeidzot pÄdÄjie Äetri biti (0011), vai 3.
TÄpÄc Å”ajÄ kompresijas posmÄ ir ļoti sarežģīti saprast baitus. Baiti nepÄrstÄv to, kas Ŕķiet. Es neievadīŔu tabulas darbÄ«bas detaļÄs Å”ajÄ rakstÄ, bet par Å”o jautÄjumu tÄ«meklÄ« .
Viens no interesantajiem trikiem, kuru varat izdarÄ«t, zinot to ā atdalÄ«t JPEG virsrakstu un glabÄt to atseviŔķi. PatiesÄ«bÄ tas nozÄ«mÄ, ka failu varÄsiet izlasÄ«t tikai jÅ«s. Facebook to dara, lai vÄl vairÄk samazinÄtu failus.
Ko vÄl var izdarÄ«t ā nedaudz mainÄ«t Hafmana tabulu. Citiem tas izskatÄ«sies kÄ sabojÄts attÄls. Un tikai jÅ«s zinÄsiet burvju variantu tÄs labojumam.
KopsavilkumÄ: kas tad nepiecieÅ”ams JPEG dekodÄÅ”anai? NepiecieÅ”ams:
- Izvilkt Hafmana tabulu (tabulas) no virsraksta un dekodÄt bitus.
- IegÅ«t diskreÄÄ kosinusa transformÄcijas koeficientus katrai krÄsas un spilgtuma komponentÄm katram 8x8 blokam, veicot atpakaļsvÄrÅ”anas garo secÄ«bu un delta kodÄÅ”anu.
- Apvienot kosinusus, pamatojoties uz koeficientiem, lai iegÅ«tu pikseļu vÄrtÄ«bas katram 8x8 blokam.
- MÄrÄ«t krÄsu komponentus, ja tika veikta apakÅ”diskretizÄcija (Ŕī informÄcija ir galvenÄ).
- PÄrvÄrst iegÅ«tÄs YCbCr vÄrtÄ«bas katram pikselim RGB.
- ParÄdÄ«t attÄlu ekrÄnÄ!
Liela apjoma darbs vienkÄrÅ”ai kaÄ·u attÄla apskatei! TomÄr, kas man tajÄ patÄ«k - ir redzams, cik tehnoloÄ£ija JPEG ir cilvÄkam centrÄta. TÄ balstÄs uz mÅ«su uztveres Ä«paŔībÄm, ļaujot sasniegt ievÄrojami labÄku saspieÅ”anu nekÄ parastÄs tehnoloÄ£ijas. Un tagad, saprotot, kÄ darbojas JPEG, varam iedomÄties, kÄ Å”Ä«s tehnoloÄ£ijas varÄtu tikt piemÄrotas citÄs jomÄs. PiemÄram, delta kodÄÅ”ana video varÄtu sniegt ievÄrojamu faila lieluma samazinÄjumu, jo bieži ir veselas zonas, kas nemainÄs no kadra uz kadru (piemÄram, fons).
, ir pieejams un satur norÄdÄ«jumus, kÄ nomainÄ«t attÄlus uz savÄjiem.
Avots: habr.com
