Paano gumagana ang format na JPEG

Ang mga larawang JPEG ay nasa lahat ng dako sa ating mga digital na buhay, ngunit sa likod ng pagpapakitang ito ng kamalayan ay mga algorithm na nag-aalis ng mga detalye na hindi nakikita ng mata ng tao. Ang resulta ay ang pinakamataas na kalidad ng visual sa pinakamaliit na laki ng file - ngunit paano eksaktong gumagana ang lahat ng ito? Tingnan natin kung ano ang eksaktong hindi nakikita ng ating mga mata!

Paano gumagana ang format na JPEG

Madaling balewalain ang kakayahang magpadala ng larawan sa isang kaibigan at huwag mag-alala tungkol sa kung anong device, browser o operating system ang kanilang ginagamit - ngunit hindi iyon palaging nangyari. Sa unang bahagi ng 1980s, ang mga computer ay maaaring mag-imbak at magpakita ng mga digital na imahe, ngunit mayroong maraming mga nakikipagkumpitensya na ideya tungkol sa pinakamahusay na paraan upang gawin ito. Hindi ka maaaring magpadala ng isang imahe mula sa isang computer patungo sa isa pa at umaasa na gagana ito.

Upang malutas ang problemang ito, isang komite ng mga eksperto mula sa buong mundo ay binuo noong 1986 na tinatawag na "Pinagsamang Grupo ng mga Eksperto sa PotograpiyaΒ» (Joint Photographic Experts Group, JPEG), na itinatag bilang magkasanib na pagsisikap sa pagitan ng International Organization for Standardization (ISO) at ng International Electrotechnical Commission (IEC), dalawang organisasyong pang-internasyonal na pamantayan na naka-headquarter sa Geneva, Switzerland.

Isang pangkat ng mga tao na tinatawag na JPEG ang lumikha ng JPEG digital image compression standard noong 1992. Ang sinumang gumamit ng Internet ay malamang na nakatagpo ng mga larawang naka-encode ng JPEG. Ito ang pinakakaraniwang paraan upang mag-encode, magpadala at mag-imbak ng mga larawan. Mula sa mga web page hanggang sa email hanggang sa social media, ang JPEG ay ginagamit nang bilyun-bilyong beses sa isang arawβ€”halos sa tuwing titingin kami ng larawan online o ipinapadala ito. Kung walang JPEG, ang web ay magiging hindi gaanong makulay, mas mabagal, at malamang na magkakaroon ng mas kaunting larawan ng pusa!

Ang artikulong ito ay tungkol sa kung paano mag-decode ng isang JPEG na imahe. Sa madaling salita, kung ano ang kinakailangan upang i-convert ang naka-compress na data na nakaimbak sa isang computer sa isang imahe na lumilitaw sa screen. Ito ay nagkakahalaga ng pag-alam, hindi lamang dahil mahalaga na maunawaan ang teknolohiyang ginagamit namin araw-araw, ngunit dahil din sa pag-unlock ng mga antas ng compression, mas natututo kami tungkol sa perception at paningin, at kung anong mga detalye ang pinakasensitibo sa aming mga mata.

Bilang karagdagan, ang paglalaro ng mga imahe sa ganitong paraan ay lubhang kawili-wili.

Paano gumagana ang format na JPEG

Nakatingin sa loob ng JPEG

Sa isang computer, ang lahat ay nakaimbak bilang isang pagkakasunud-sunod ng mga binary na numero. Karaniwan ang mga bit na ito, mga zero at isa, ay pinagsama-sama sa mga pangkat ng walong upang bumuo ng mga byte. Kapag nagbukas ka ng isang JPEG na imahe sa isang computer, isang bagay (isang browser, isang operating system, iba pa) ang dapat mag-decode ng mga byte, na ibabalik ang orihinal na larawan bilang isang listahan ng mga kulay na maaaring ipakita.

Kung ida-download mo itong matamis larawan ng isang pusa at buksan ito sa isang text editor, makikita mo ang isang grupo ng mga hindi magkakaugnay na mga character.

Paano gumagana ang format na JPEG
Narito ako ay gumagamit ng Notepad++ upang suriin ang mga nilalaman ng file, dahil ang mga regular na text editor tulad ng Notepad sa Windows ay sisira sa binary file pagkatapos i-save at hindi na nito masisiyahan ang JPEG na format.

Ang pagbubukas ng isang imahe sa isang word processor ay nakakalito sa computer, tulad ng pagkalito mo sa iyong utak kapag kinusot mo ang iyong mga mata at nagsimulang makakita ng mga spot ng kulay!

Ang mga spot na ito na nakikita mo ay kilala bilang phosphenes, at hindi resulta ng isang magaan na stimulus o isang guni-guni na nabuo ng isip. Nangyayari ang mga ito dahil iniisip ng iyong utak na ang anumang mga de-koryenteng signal sa mga optic nerve ay naghahatid ng impormasyon tungkol sa liwanag. Kailangang gawin ng utak ang mga pagpapalagay na ito dahil walang paraan upang malaman kung ang signal ay tunog, pangitain, o iba pa. Ang lahat ng mga nerbiyos sa katawan ay nagpapadala ng eksaktong parehong mga electrical impulses. Sa pamamagitan ng paglalapat ng presyon sa iyong mga mata, nagpapadala ka ng mga signal na hindi nakikita, ngunit pinapagana ang mga receptor ng mata, na binibigyang-kahulugan ng iyong utak - sa kasong ito, hindi tama - bilang isang bagay na nakikita. Literal na makikita mo ang pressure!

Nakakatuwang isipin kung gaano kapareho ang mga computer sa utak, ngunit isa rin itong kapaki-pakinabang na pagkakatulad upang ilarawan kung gaano kalaki ang kahulugan ng dataβ€”nadadala man sa katawan ng mga nerbiyos o nakaimbak sa isang computerβ€”ay nakadepende sa kung paano ito binibigyang kahulugan. Ang lahat ng binary data ay binubuo ng 0s at 1s, ang mga pangunahing bahagi na maaaring maghatid ng impormasyon sa anumang uri. Madalas na alam ng iyong computer kung paano i-interpret ang mga ito sa pamamagitan ng paggamit ng mga pahiwatig gaya ng mga extension ng file. Ngayon ay pinipilit namin itong i-interpret ang mga ito bilang text, dahil iyon ang inaasahan ng text editor.

Upang maunawaan kung paano i-decode ang JPEG, kailangan nating makita mismo ang orihinal na mga signal - ang binary data. Magagawa ito gamit ang isang hexadecimal editor, o direkta sa orihinal na artikulo sa web page! Mayroong isang imahe, sa tabi kung saan nasa field ng teksto ang lahat ng mga byte nito (maliban sa header), na ipinakita sa decimal na anyo. Maaari mong baguhin ang mga ito, at ang script ay muling i-encode at gagawa ng isang bagong imahe sa mabilisang.

Paano gumagana ang format na JPEG

Marami kang matututuhan sa pamamagitan lamang ng paglalaro sa editor na ito. Halimbawa, masasabi mo ba kung anong pagkakasunud-sunod ang mga pixel na nakaimbak?

Ang kakaiba sa halimbawang ito ay ang pagbabago ng ilang mga numero ay hindi nakakaapekto sa imahe, ngunit, halimbawa, kung papalitan mo ang numero 17 ng 0 sa unang linya, ang larawan ay ganap na masisira!

Paano gumagana ang format na JPEG

Ang iba pang mga pagbabago, tulad ng pagpapalit ng 7 sa linya ng 1988 sa numerong 254, ay nagbabago sa kulay, ngunit lamang ng mga kasunod na pixel.

Paano gumagana ang format na JPEG

Marahil ang kakaibang bagay ay ang ilang mga numero ay nagbabago hindi lamang sa kulay, kundi pati na rin sa hugis ng imahe. Baguhin ang 70 sa linya 12 sa 2 at tingnan ang tuktok na hilera ng larawan upang makita kung ano ang ibig kong sabihin.

Paano gumagana ang format na JPEG

At kahit anong JPEG image ang gamitin mo, palagi mong makikita ang mga mahiwagang pattern ng chess na ito kapag nag-e-edit ng mga byte.

Kapag naglalaro sa editor, mahirap maunawaan kung paano muling ginawa ang isang larawan mula sa mga byte na ito, dahil ang JPEG compression ay binubuo ng tatlong magkakaibang teknolohiya, na inilapat nang sunud-sunod sa mga antas. Pag-aaralan natin ang bawat isa nang hiwalay upang matuklasan ang mahiwagang pag-uugali na nakikita natin.

Tatlong antas ng JPEG compression:

  1. Color subsampling.
  2. Discrete cosine transform at sampling.
  3. Run length encoding, delta ΠΈ Huffman

Upang mabigyan ka ng ideya ng magnitude ng compression, tandaan na ang imahe sa itaas ay kumakatawan sa 79 na numero, o humigit-kumulang 819 KB. Kung iimbak namin ito nang walang compression, ang bawat pixel ay mangangailangan ng tatlong numero - para sa pula, berde at asul na mga bahagi. Ito ay aabot sa 79 na numero, o humigit-kumulang. 917 KB. Bilang resulta ng JPEG compression, ang huling file ay nabawasan ng higit sa 700 beses!

Sa katunayan, ang larawang ito ay maaaring ma-compress nang higit pa. Nasa ibaba ang dalawang larawan na magkatabi - ang larawan sa kanan ay na-compress sa 16 KB, ibig sabihin, 57 beses na mas maliit kaysa sa hindi naka-compress na bersyon!

Paano gumagana ang format na JPEG

Kung titingnan mong mabuti, makikita mo na ang mga larawang ito ay hindi magkapareho. Pareho sa mga ito ay mga imahe na may JPEG compression, ngunit ang tama ay mas maliit sa volume. Medyo masama din ang hitsura nito (tingnan ang mga square color ng background). Kaya naman ang JPEG ay tinatawag ding lossy compression; Sa panahon ng proseso ng compression, nagbabago ang imahe at nawawala ang ilang mga detalye.

1. Color subsampling

Narito ang isang imahe na may unang antas lamang ng compression na inilapat.

Paano gumagana ang format na JPEG
(Interactive na bersyon - sa orihinal mga artikulo). Ang pag-alis ng isang numero ay sumisira sa lahat ng mga kulay. Gayunpaman, kung eksaktong anim na numero ang aalisin, halos walang epekto ito sa imahe.

Ngayon ang mga numero ay medyo mas madaling maintindihan. Ito ay halos isang simpleng listahan ng mga kulay, kung saan ang bawat byte ay nagbabago ng eksaktong isang pixel, ngunit sa parehong oras ito ay kalahati na ng laki ng hindi naka-compress na imahe (na aabot ng humigit-kumulang 300 KB sa pinababang laki na ito). Maaari mo bang hulaan kung bakit?

Makikita mo na ang mga numerong ito ay hindi kumakatawan sa karaniwang pula, berde, at asul na bahagi, dahil kung papalitan natin ang lahat ng numero ng mga zero, makakakuha tayo ng berdeng imahe (sa halip na puti).

Paano gumagana ang format na JPEG

Ito ay dahil ang mga byte na ito ay kumakatawan sa Y (liwanag),

Paano gumagana ang format na JPEG

Cb (relative blueness),

Paano gumagana ang format na JPEG

at Cr (relative redness) na mga larawan.

Paano gumagana ang format na JPEG

Bakit hindi gumamit ng RGB? Pagkatapos ng lahat, ito ay kung paano gumagana ang karamihan sa mga modernong screen. Maaaring magpakita ang iyong monitor ng anumang kulay, kabilang ang pula, berde at asul, na may iba't ibang intensity para sa bawat pixel. Nakukuha ang puti sa pamamagitan ng pag-on sa lahat ng tatlo sa buong liwanag, at itim sa pamamagitan ng pag-off sa mga ito.

Paano gumagana ang format na JPEG

Ito rin ay halos kapareho sa kung paano gumagana ang mata ng tao. Ang mga receptor ng kulay sa ating mga mata ay tinatawag na "mga konoβ€œ, at nahahati sa tatlong uri, ang bawat isa ay mas sensitibo sa alinman sa pula, berde, o asul na mga kulay [S-type cones ay sensitibo sa violet-blue (S mula sa English Short - short-wave spectrum), M -type - sa berde-dilaw (M mula sa English Medium - medium-wave), at L-type - sa yellow-red (L mula sa English Long - long-wave) na bahagi ng spectrum. Ang pagkakaroon ng tatlong uri ng cones na ito (at mga rod, na sensitibo sa esmeralda na berdeng bahagi ng spectrum) ay nagbibigay sa isang tao ng kulay na paningin. / tinatayang. transl.]. Sticks, isa pang uri ng photoreceptor sa ating mga mata, ay may kakayahang makakita ng mga pagbabago sa liwanag, ngunit mas sensitibo sa kulay. Ang ating mga mata ay may humigit-kumulang 120 milyong mga baras at 6 na milyong mga kono lamang.

Ito ang dahilan kung bakit mas mahusay ang ating mga mata sa pag-detect ng mga pagbabago sa liwanag kaysa sa mga pagbabago sa kulay. Kung ihihiwalay mo ang kulay sa ningning, maaari mong alisin ang kaunting kulay at walang makakapansin ng anuman. Ang Chroma subsampling ay ang proseso ng pagkatawan sa mga bahagi ng kulay ng isang imahe sa isang mas mababang resolution kaysa sa mga bahagi ng luminance. Sa halimbawa sa itaas, ang bawat pixel ay may eksaktong isang bahagi ng Y, at ang bawat indibidwal na pangkat ng apat na pixel ay may eksaktong isang bahagi ng Cb at isang Cr. Samakatuwid, ang larawan ay naglalaman ng apat na beses na mas kaunting impormasyon ng kulay kaysa sa orihinal.

Ang espasyo ng kulay ng YCbCr ay ginagamit hindi lamang sa JPEG. Ito ay orihinal na naimbento noong 1938 para sa mga programa sa telebisyon. Hindi lahat ay may kulay na TV, kaya ang paghihiwalay ng kulay at liwanag ay nagpapahintulot sa lahat na makakuha ng parehong signal, at ang mga TV na walang kulay ay ginamit lang ang bahagi ng liwanag.

Kaya ang pag-alis ng isang numero mula sa editor ay ganap na sumisira sa lahat ng mga kulay. Ang mga bahagi ay naka-imbak sa form na YYYY Cb Cr (sa katunayan, hindi kinakailangan sa ganoong pagkakasunud-sunod - ang pagkakasunud-sunod ng imbakan ay tinukoy sa header ng file). Ang pag-alis sa unang numero ay magiging sanhi ng unang halaga ng Cb na maramdaman bilang Y, Cr bilang Cb, at sa pangkalahatan ay magkakaroon ka ng domino effect na nagpapalit ng lahat ng kulay ng larawan.

Hindi ka pinipilit ng detalye ng JPEG na gamitin ang YCbCr. Ngunit ginagamit ito ng karamihan sa mga file dahil gumagawa ito ng mas mahusay na downsampled na mga imahe kaysa sa RGB. Ngunit hindi mo kailangang kunin ang aking salita para dito. Tingnan mo mismo sa talahanayan sa ibaba kung ano ang magiging hitsura ng subsampling ng bawat indibidwal na bahagi sa RGB at YCbCr.

Paano gumagana ang format na JPEG
(Interactive na bersyon - sa orihinal mga artikulo).

Ang pag-alis ng asul ay hindi kapansin-pansin kumpara sa pula o berde. Iyon ay dahil sa anim na milyong cone sa iyong mga mata, humigit-kumulang 64% ang sensitibo sa pula, 32% sa berde at 2% sa asul.

Ang downsampling ng bahagi ng Y (kaliwa sa ibaba) ay pinakamahusay na nakikita. Kahit maliit na pagbabago ay kapansin-pansin.

Ang pag-convert ng imahe mula sa RGB patungo sa YCbCr ay hindi nakakabawas sa laki ng file, ngunit ginagawa nitong mas madali ang paghahanap ng hindi gaanong nakikitang mga detalye na maaaring alisin. Ang lossy compression ay nangyayari sa ikalawang yugto. Ito ay batay sa ideya ng pagpapakita ng data sa isang mas compressible na form.

2. Discrete cosine transform at sampling

Ang antas ng compression na ito ay, para sa karamihan, kung ano ang tungkol sa JPEG. Pagkatapos i-convert ang mga kulay sa YCbCr, ang mga bahagi ay i-compress nang paisa-isa, para makapag-concentrate tayo sa Y component lang At narito ang hitsura ng Y component byte pagkatapos ilapat ang layer na ito.

Paano gumagana ang format na JPEG
(Interactive na bersyon - sa orihinal mga artikulo). Sa interactive na bersyon, ang pag-click sa isang pixel ay nag-i-scroll sa editor sa linya na kumakatawan dito. Subukang alisin ang mga numero mula sa dulo o magdagdag ng ilang mga zero sa isang tiyak na numero.

Sa unang tingin, mukhang napakasama ng compression. Mayroong 100 pixels sa isang imahe, at nangangailangan ng 000 na numero upang kumatawan sa kanilang liwanag (Y-mga bahagi)β€”mas masama iyon kaysa sa pag-compress ng wala!

Gayunpaman, tandaan na ang karamihan sa mga numerong ito ay zero. Bukod dito, ang lahat ng mga zero sa dulo ng mga linya ay maaaring alisin nang hindi binabago ang imahe. May mga 26 na numero ang natitira, at ito ay halos 000 na beses na mas kaunti!

Ang antas na ito ay naglalaman ng sikreto ng mga pattern ng chess. Hindi tulad ng iba pang mga epekto na nakita namin, ang hitsura ng mga pattern na ito ay hindi isang glitch. Sila ang mga bloke ng gusali ng buong imahe. Ang bawat linya ng editor ay naglalaman ng eksaktong 64 na numero, discrete cosine transform (DCT) coefficients na tumutugma sa intensity ng 64 na natatanging pattern.

Ang mga pattern na ito ay nabuo batay sa cosine plot. Narito ang hitsura ng ilan sa kanila:

Paano gumagana ang format na JPEG
8 sa 64 na logro

Nasa ibaba ang isang larawan na nagpapakita ng lahat ng 64 na pattern.

Paano gumagana ang format na JPEG
(Interactive na bersyon - sa orihinal mga artikulo).

Ang mga pattern na ito ay may partikular na kahalagahan dahil sila ang bumubuo sa batayan ng 8x8 na mga imahe. Kung hindi ka pamilyar sa linear algebra, nangangahulugan ito na ang anumang 8x8 na imahe ay maaaring gawin mula sa 64 na pattern na ito. Ang DCT ay ang proseso ng paghahati ng mga imahe sa 8x8 na bloke at pag-convert ng bawat bloke sa kumbinasyon ng 64 na coefficient na ito.

Parang magic na ang anumang imahe ay maaaring binubuo ng 64 na partikular na pattern. Gayunpaman, ito ay kapareho ng pagsasabi na ang anumang lugar sa Earth ay maaaring ilarawan sa pamamagitan ng dalawang numero - latitude at longitude [nagsasaad ng hemispheres / approx. transl.]. Madalas nating iniisip ang ibabaw ng Earth bilang two-dimensional, kaya dalawang numero lang ang kailangan natin. Ang isang 8x8 na imahe ay may 64 na dimensyon, kaya kailangan namin ng 64 na numero.

Hindi pa malinaw kung paano ito nakakatulong sa amin sa mga tuntunin ng compression. Kung kailangan namin ng 64 na numero upang kumatawan sa isang 8x8 na imahe, bakit ito ay mas mahusay kaysa sa pag-iimbak lamang ng 64 na bahagi ng liwanag? Ginagawa namin ito para sa parehong dahilan kung bakit ginawa namin ang tatlong numero ng RGB sa tatlong numero ng YCbCr: nagbibigay-daan ito sa amin na alisin ang mga banayad na detalye.

Mahirap makita kung anong detalye ang aalisin sa yugtong ito dahil inilalapat ng JPEG ang DCT sa mga 8x8 na bloke. Gayunpaman, walang sinuman ang nagbabawal sa amin na ilapat ito sa buong larawan. Narito kung ano ang hitsura ng DCT para sa bahagi ng Y na inilapat sa buong larawan:

Paano gumagana ang format na JPEG

Mahigit sa 60 numero ang maaaring alisin mula sa dulo nang halos walang kapansin-pansing pagbabago sa larawan.

Paano gumagana ang format na JPEG

Gayunpaman, tandaan na kung i-zero out natin ang unang limang numero, magiging halata ang pagkakaiba.

Paano gumagana ang format na JPEG

Ang mga numero sa simula ay kumakatawan sa mababang dalas ng mga pagbabago sa larawan, na pinakamahusay na nakikita ng ating mga mata. Ang mga numero sa dulo ay nagpapahiwatig ng mga pagbabago sa matataas na frequency na mas mahirap mapansin. Upang "makita kung ano ang hindi nakikita ng mata," maaari nating ihiwalay ang mga detalyeng ito ng mataas na dalas sa pamamagitan ng pag-zero sa unang 5000 na numero.

Paano gumagana ang format na JPEG

Nakikita namin ang lahat ng mga lugar ng imahe kung saan ang pinakamalaking pagbabago ay nangyayari mula sa pixel patungo sa pixel. Ang mga mata ng pusa, ang kanyang mga balbas, ang terry na kumot at ang mga anino sa ibabang kaliwang sulok ay namumukod-tangi. Maaari kang pumunta nang higit pa sa pamamagitan ng pag-zero sa unang 10 numero:

Paano gumagana ang format na JPEG

20 000:

Paano gumagana ang format na JPEG

40 000:

Paano gumagana ang format na JPEG

60 000:

Paano gumagana ang format na JPEG

Ang mga detalyeng ito ng mataas na dalas ay inalis ng JPEG sa panahon ng yugto ng compression. Walang pagkawala sa pag-convert ng mga kulay sa mga coefficient ng DCT. Nangyayari ang pagkawala sa hakbang ng sampling, kung saan inaalis ang mga high-frequency o malapit sa zero na halaga. Kapag ibinaba mo ang kalidad ng pag-save ng JPEG, pinapataas ng programa ang threshold para sa bilang ng mga value na inalis, na nagpapababa sa laki ng file, ngunit ginagawang mas pixelated ang larawan. Kaya naman ganito ang hitsura ng larawan sa unang seksyon, na 57 beses na mas maliit. Ang bawat 8x8 block ay kinakatawan ng mas kaunting DCT coefficient kumpara sa mas mataas na kalidad na bersyon.

Maaari kang lumikha ng isang cool na epekto tulad ng unti-unting pag-stream ng mga imahe. Maaari kang magpakita ng malabong larawan na nagiging mas detalyado habang dumarami ang mga koepisyent na dina-download.

Dito, katuwaan lang, ang makukuha mo gamit lang ang 24 numero:

Paano gumagana ang format na JPEG

O 5000 lang:

Paano gumagana ang format na JPEG

Napakalabo, ngunit kahit papaano ay nakikilala!

3. Run length encoding, delta at Huffman

Sa ngayon, ang lahat ng mga yugto ng compression ay lossy. Ang huling yugto, sa kabaligtaran, ay nagpapatuloy nang walang pagkalugi. Hindi nito tinatanggal ang impormasyon, ngunit makabuluhang binabawasan nito ang laki ng file.

Paano mo mai-compress ang isang bagay nang hindi nagtatapon ng impormasyon? Isipin kung paano namin ilalarawan ang isang simpleng itim na parihaba na 700 x 437.

Gumagamit ang JPEG ng 5000 na numero para dito, ngunit mas mahusay na mga resulta ang maaaring makamit. Maaari mo bang isipin ang isang encoding scheme na maglalarawan ng ganoong imahe sa kasing-kaunting mga byte hangga't maaari?

Ang minimal na scheme na maaari kong mabuo ay gumagamit ng apat: tatlo upang kumatawan sa isang kulay, at isang ikaapat upang ipahiwatig kung gaano karaming mga pixel ang mayroon ang kulay na iyon. Ang ideya na kumakatawan sa mga paulit-ulit na halaga sa ganitong condensed na paraan ay tinatawag na run-length encoding. Ito ay lossless dahil maaari naming ibalik ang naka-encode na data sa orihinal nitong anyo.

Ang isang JPEG file na may isang itim na parihaba ay mas malaki kaysa sa 4 na byte - tandaan na sa antas ng DCT, ang compression ay inilalapat sa 8x8 pixel na mga bloke. Samakatuwid, sa pinakamababa, kailangan namin ng isang DCT coefficient para sa bawat 64 pixels. Kailangan namin ng isa dahil sa halip na mag-imbak ng isang DCT coefficient na sinusundan ng 63 zero, ang run length encoding ay nagpapahintulot sa amin na mag-imbak ng isang numero at ipahiwatig na "lahat ng iba ay mga zero."

Ang Delta encoding ay isang pamamaraan kung saan ang bawat byte ay naglalaman ng pagkakaiba mula sa ilang halaga, sa halip na isang ganap na halaga. Samakatuwid, ang pag-edit ng ilang mga byte ay nagbabago sa kulay ng lahat ng iba pang mga pixel. Halimbawa, sa halip na mag-imbak

12 13 14 14 14 13 13 14

Maaari tayong magsimula sa 12 at pagkatapos ay ipahiwatig lamang kung magkano ang kailangan nating idagdag o ibawas upang makuha ang susunod na numero. At ang pagkakasunud-sunod na ito sa delta coding ay nasa anyo:

12 1 1 0 0 -1 0 1

Ang na-convert na data ay hindi mas maliit kaysa sa orihinal na data, ngunit mas madaling i-compress ito. Malaki ang maitutulong ng paglalapat ng delta encoding bago ang run length encoding habang lossless compression pa rin.

Ang Delta coding ay isa sa ilang mga diskarteng ginagamit sa labas ng 8x8 blocks. Sa 64 na coefficient ng DCT, ang isa ay isang pare-parehong function ng wave (solid na kulay). Kinakatawan nito ang average na liwanag ng bawat bloke para sa mga bahagi ng luma, o ang average na pagka-asul para sa mga bahagi ng Cb, at iba pa. Ang unang halaga ng bawat bloke ng DCT ay tinatawag na halaga ng DC, at ang bawat halaga ng DC ay delta na naka-encode na may paggalang sa mga nauna. Samakatuwid, ang pagbabago ng liwanag ng unang bloke ay makakaapekto sa lahat ng mga bloke.

Ang huling misteryo ay nananatili: paano ang pagpapalit ng isahan ay ganap na nasisira ang buong larawan? Sa ngayon, ang mga antas ng compression ay walang ganoong mga katangian. Ang sagot ay nasa JPEG header. Ang unang 500 byte ay naglalaman ng metadata tungkol sa larawan - lapad, taas, atbp., at hindi pa kami nakikipagtulungan sa kanila.

Kung walang header halos imposible (o napakahirap) na i-decode ang JPEG. Mukhang sinusubukan kong ilarawan sa iyo ang larawan, at nagsisimula akong mag-imbento ng mga salita upang maihatid ang aking impresyon. Ang paglalarawan ay malamang na medyo condensed, dahil maaari akong mag-imbento ng mga salita na may eksaktong kahulugan na nais kong ipahiwatig, ngunit para sa lahat ay hindi sila magkakaroon ng kahulugan.

Parang tanga, pero ganun talaga ang nangyayari. Ang bawat JPEG na imahe ay na-compress na may mga code na partikular dito. Ang diksyunaryo ng code ay naka-imbak sa header. Ang pamamaraan na ito ay tinatawag na Huffman code at ang bokabularyo ay tinatawag na Huffman table. Sa header, ang talahanayan ay minarkahan ng dalawang byte - 255 at pagkatapos ay 196. Ang bawat bahagi ng kulay ay maaaring magkaroon ng sarili nitong talahanayan.

Ang mga pagbabago sa mga talahanayan ay radikal na makakaapekto sa anumang larawan. Ang isang magandang halimbawa ay ang baguhin ang ika-15 na linya sa 1.

Paano gumagana ang format na JPEG

Nangyayari ito dahil tinutukoy ng mga talahanayan kung paano dapat basahin ang mga indibidwal na bit. Sa ngayon kami ay nagtrabaho lamang sa mga binary na numero sa decimal form. Ngunit itinago nito sa amin ang katotohanan na kung gusto mong iimbak ang numero 1 sa isang byte, ito ay magmumukhang 00000001, dahil ang bawat byte ay dapat na may eksaktong walong bits, kahit na isa lamang sa mga ito ang kailangan.

Ito ay potensyal na isang malaking pag-aaksaya ng espasyo kung mayroon kang maraming maliliit na numero. Ang Huffman code ay isang pamamaraan na nagbibigay-daan sa amin na i-relax ang kinakailangang ito na ang bawat numero ay dapat sumakop ng walong piraso. Nangangahulugan ito na kung makakita ka ng dalawang byte:

234 115

Pagkatapos, depende sa talahanayan ng Huffman, maaaring tatlong numero ang mga ito. Upang kunin ang mga ito, kailangan mo munang hatiin ang mga ito sa mga indibidwal na piraso:

11101010 01110011

Pagkatapos ay tumingin kami sa talahanayan upang malaman kung paano ipangkat ang mga ito. Halimbawa, maaaring ito ang unang anim na bits, (111010), o 58 sa decimal, na sinusundan ng limang bits (10011), o 19, at panghuli ang huling apat na bits (0011), o 3.

Samakatuwid, napakahirap na maunawaan ang mga byte sa yugtong ito ng compression. Ang mga byte ay hindi kumakatawan sa kung ano ang hitsura nila. Hindi ako pupunta sa mga detalye ng pagtatrabaho sa talahanayan sa artikulong ito, ngunit kagamitan sa isyung ito online ay sapat.

Ang isang kawili-wiling trick na maaari mong gawin sa kaalamang ito ay ang paghiwalayin ang header mula sa JPEG at iimbak ito nang hiwalay. Sa katunayan, lumalabas na ikaw lang ang makakabasa ng file. Ginagawa ito ng Facebook upang gawing mas maliit ang mga file.

Ano pa ang maaaring gawin ay palitan ng kaunti ang talahanayan ng Huffman. Para sa iba ay magmumukha itong sirang larawan. At ikaw lang ang makakaalam ng mahiwagang paraan para ayusin ito.

Ibuod natin: kaya ano ang kailangan para ma-decode ang JPEG? kailangan:

  1. I-extract ang (mga) talahanayan ng Huffman mula sa header at i-decode ang mga bit.
  2. I-extract ang discrete cosine transform coefficients para sa bawat bahagi ng kulay at luminance para sa bawat 8x8 block, na gumaganap ng inverse run-length at delta encoding transforms.
  3. Pagsamahin ang mga cosine batay sa mga coefficient upang makakuha ng mga halaga ng pixel para sa bawat 8x8 block.
  4. I-scale ang mga bahagi ng kulay kung isinagawa ang subsampling (nasa header ang impormasyong ito).
  5. I-convert ang mga nagresultang halaga ng YCbCr para sa bawat pixel sa RGB.
  6. Ipakita ang larawan sa screen!

Seryosong trabaho para sa simpleng pagtingin sa isang larawan na may pusa! Gayunpaman, ang gusto ko tungkol dito ay ipinapakita nito kung gaano nakasentro sa tao ang teknolohiyang JPEG. Ito ay batay sa mga kakaibang katangian ng ating pang-unawa, na nagpapahintulot sa amin na makamit ang mas mahusay na compression kaysa sa mga nakasanayang teknolohiya. At ngayong naiintindihan na natin kung paano gumagana ang JPEG, maiisip natin kung paano mailipat ang mga teknolohiyang ito sa ibang mga lugar. Halimbawa, ang pag-encode ng delta sa video ay maaaring magbigay ng makabuluhang pagbawas sa laki ng file, dahil kadalasan ay may mga buong lugar na hindi nagbabago mula sa frame hanggang sa frame (halimbawa, ang background).

Code na ginamit sa artikulo, ay bukas, at naglalaman ng mga tagubilin kung paano palitan ang mga larawan ng iyong sarili.

Pinagmulan: www.habr.com

Magdagdag ng komento