Hoe die JPEG-formaat werk

JPEG-beelde is alomteenwoordig in ons digitale lewens, maar agter daardie dekmantel van bewustheid is algoritmes wat besonderhede verwyder wat die menslike oog nie kan sien nie. Die resultaat is die hoogste visuele kwaliteit in die kleinste lêergrootte - maar hoe presies werk dit alles? Kom ons kyk wat presies ons oë nie sien nie!

Hoe die JPEG-formaat werk

Dit is maklik om die vermoë om 'n foto aan 'n vriend te stuur as vanselfsprekend te aanvaar en nie bekommerd te wees oor watter toestel, blaaier of bedryfstelsel hulle gebruik nie - maar dit was nie altyd die geval nie. Teen die vroeë 1980's kon rekenaars digitale beelde stoor en vertoon, maar daar was baie mededingende idees oor die beste manier om dit te doen. Jy kon nie net 'n prent van een rekenaar na 'n ander stuur en hoop dit werk nie.

Om hierdie probleem op te los, is 'n komitee van kundiges van regoor die wêreld in 1986 saamgestel onder die naam "Gesamentlike fotografiese kundigesgroep” (Joint Photographic Experts Group, JPEG), gestig as deel van die gesamentlike werk van die Internasionale Organisasie vir Standaardisering (ISO) en die Internasionale Elektrotegniese Kommissie (IEC), twee internasionale standaardorganisasies met sy hoofkwartier in Genève (Switserland).

’n Groep mense genaamd JPEG het die JPEG-digitale beeldkompressiestandaard in 1992 geskep. Enigiemand wat die internet gebruik het, het waarskynlik JPEG-geënkodeerde beelde teëgekom. Dit is die mees algemene manier om beelde te enkodeer, te stuur en te stoor. Van webblaaie tot e-pos na sosiale media, JPEG word biljoene kere per dag gebruik – amper elke keer as ons 'n prent aanlyn bekyk of stuur. Sonder JPEG's sou die web minder helder, stadiger wees en waarskynlik minder katfoto's hê!

Hierdie artikel handel oor hoe om 'n JPEG-prent te dekodeer. Met ander woorde, oor wat nodig is om saamgeperste data wat op 'n rekenaar gestoor is, om te skakel na 'n beeld wat op die skerm verskyn. Dit is die moeite werd om oor te weet, nie net omdat dit belangrik is om die tegnologie wat ons daagliks gebruik te verstaan ​​nie, maar ook omdat ons die persepsie en visie beter sal ken, asook watter besonderhede ons oë die meeste is deur die vlakke van kompressie te openbaar. sensitief vir.

Boonop is dit baie interessant om op hierdie manier met beelde te speel.

Hoe die JPEG-formaat werk

Kyk binne 'n JPEG

Op 'n rekenaar word alles as 'n reeks binêre getalle gestoor. Gewoonlik word hierdie bisse, nulle en ene, in agtste gegroepeer, wat grepe uitmaak. Wanneer jy 'n JPEG-prent op jou rekenaar oopmaak, moet iets (blaaier, bedryfstelsel, wat ook al) die grepe dekodeer, wat die oorspronklike prent herstel as 'n lys van kleure wat vertoon kan word.

As jy hierdie oulike aflaai foto van 'n kat en maak dit oop in 'n teksredigeerder, sal jy 'n klomp deurmekaar karakters sien.

Hoe die JPEG-formaat werk
Hier gebruik ek Notepad++ om die inhoud van die lêer te inspekteer, want algemene teksredigeerders soos Notepad van Windows sal die binêre deurmekaar maak nadat dit gestoor is en dit sal nie by die JPEG-formaat pas nie.

Om 'n prent in 'n teksredigeerder oop te maak, verwar jou rekenaar, net soos jy jou brein verwar wanneer jy jou oë vryf en gekleurde kolle begin sien!

Hierdie kolle wat jy sien staan ​​bekend as fosfene, en is nie die gevolg van blootstelling aan 'n ligstimulus of hallusinasies wat deur die verstand gegenereer word nie. Hulle vind plaas omdat jou brein dink dat enige elektriese seine in die optiese senuwees inligting oor lig dra. Die brein moet sulke aannames maak, want daar is geen manier om te weet of die sein 'n klank, 'n visie of iets anders is nie. Alle senuwees in die liggaam dra presies dieselfde elektriese impulse oor. Wanneer jy druk op jou oë toepas, stuur jy seine wat nie visueel is nie, maar reseptore in die oog aktiveer, wat jou brein interpreteer—in hierdie geval verkeerd—as iets visueels. Jy kan letterlik die druk sien!

Dit is snaaks om te dink aan hoe soortgelyk rekenaars aan die brein is, maar dit is ook 'n nuttige analogie, wat illustreer hoeveel die betekenis van data - of dit nou deur die liggaam deur senuwees gedra word of in 'n rekenaar gestoor word - afhang van hoe dit geïnterpreteer word. Alle binêre data bestaan ​​uit XNUMX'e en XNUMX'e, basiese komponente wat in staat is om enige soort inligting oor te dra. Jou rekenaar raai dikwels hoe om dit te interpreteer deur leidrade soos lêeruitbreidings te gebruik. Nou laat ons dit hulle as teks interpreteer, want dit is wat die teksredigeerder verwag.

Om te verstaan ​​hoe om 'n JPEG te dekodeer, moet ons die oorspronklike seine self sien - die binêre data. Dit kan gedoen word met 'n hex-redigeerder, of direk aan webblad van die oorspronklike artikel! Daar is 'n prent waarlangs in die teksveld al sy grepe (behalwe die kopskrif) in desimale vorm aangebied word. Jy kan hulle verander en die skrif sal herkodeer en 'n nuwe beeld op die vlieg produseer.

Hoe die JPEG-formaat werk

Jy kan baie leer deur net met hierdie redakteur te speel. Kan jy byvoorbeeld sê in watter volgorde die pixels gestoor word?

In hierdie voorbeeld is die vreemde ding dat die verandering van sommige nommers glad nie die beeld beïnvloed nie, en as jy byvoorbeeld die nommer 17 met 0 in die eerste reël vervang, dan sal die foto heeltemal verwoes word!

Hoe die JPEG-formaat werk

Ander veranderinge, soos die verandering van die 7 op lyn 1988 na 254, verander die kleur, maar slegs daaropvolgende pixels.

Hoe die JPEG-formaat werk

Miskien is die vreemdste ding dat sommige getalle nie net die kleur verander nie, maar ook die vorm van die beeld. Verander 70 op reël 12 na 2 en kyk na die boonste ry van die prent om te sien wat ek bedoel.

Hoe die JPEG-formaat werk

En maak nie saak watter JPEG-beeld jy gebruik nie, jy sal altyd daardie kriptiese skaakpatrone vind wanneer jy grepe redigeer.

As jy met die redigeerder speel, is dit moeilik om uit te vind hoe om 'n foto uit hierdie grepe te herskep, aangesien JPEG-kompressie uit drie verskillende tegnologieë bestaan ​​wat opeenvolgend in vlakke toegepas word. Ons sal elkeen afsonderlik bestudeer om die geheimsinnige gedrag wat ons waarneem te ontbloot.

Drie vlakke van JPEG-kompressie:

  1. Kleur substeekproefneming.
  2. Diskrete kosinustransformasie en diskretisering.
  3. Loop lengte kodering, delta и huffman

Om jou 'n idee te gee van die skaal van die kompressie, let daarop dat die prent hierbo 79 819 getalle verteenwoordig, wat ongeveer 79 KB is. As ons dit sonder kompressie sou stoor, sou ons drie nommers vir elke pixel nodig hê – vir die rooi, groen en blou komponente. Dit sou neerkom op 917 700 nommers, of ca. 917 Kb. As gevolg van JPEG-kompressie het die finale lêer met meer as 10 keer afgeneem!

Trouens, hierdie beeld kan baie meer saamgepers word. Hieronder is twee beelde langs mekaar - die foto aan die regterkant is saamgepers tot 16 KB, dit wil sê 57 keer minder as die ongekomprimeerde weergawe!

Hoe die JPEG-formaat werk

As jy mooi kyk, sal jy sien dat hierdie beelde nie identies is nie. Albei van hulle is prente met JPEG-kompressie, maar die regte een is baie kleiner in volume. Dit lyk ook 'n bietjie erger (kyk na die agtergrondkleurblokkies). Daarom word JPEG ook verliesagtige kompressie genoem; tydens die kompressieproses verander die beeld en verloor sommige besonderhede.

1. Kleur substeekproefneming

Hier is 'n prent met slegs die eerste vlak van kompressie toegepas.

Hoe die JPEG-formaat werk
(Interaktiewe weergawe in oorspronklik artikels). Die verwydering van een nommer vernietig alle kleure. As presies ses nommers egter verwyder word, het dit min tot geen effek op die beeld nie.

Nou is die getalle 'n bietjie makliker om te ontsyfer. Dit is amper 'n eenvoudige lys van kleure, elke greep verander presies een pixel, maar dit is reeds die helfte van die grootte van 'n ongecomprimeerde beeld (wat ongeveer 300 KB in so 'n verminderde grootte sal neem). Raai hoekom?

Jy kan sien dat hierdie getalle nie die standaard rooi, groen en blou komponente verteenwoordig nie, want as ons al die getalle met nulle vervang, kry ons 'n groen beeld (nie 'n wit nie).

Hoe die JPEG-formaat werk

Dit is omdat hierdie grepe staan ​​vir Y (helderheid),

Hoe die JPEG-formaat werk

Cb (relatief blou),

Hoe die JPEG-formaat werk

en Cr (relatiewe rooiheid) prente.

Hoe die JPEG-formaat werk

Hoekom nie RGB gebruik nie? Dit is immers hoe die meeste moderne skerms werk. Jou monitor kan enige kleur vertoon, insluitend rooi, groen en blou teen verskillende intensiteite vir elke pixel. Wit word verkry deur al drie op volle helderheid aan te skakel, en swart skakel hulle af.

Hoe die JPEG-formaat werk

Dit is ook baie soortgelyk aan hoe die menslike oog werk. Die kleurreseptore in ons oë word genoem "keëls“, en word in drie tipes verdeel, wat elkeen meer sensitief is vir óf rooi, óf groen, óf blou kleure [S-tipe keëls is sensitief in violetblou (S van die Engelse. Kort - kortgolflengtespektrum), M-tipe - in groen-geel (M van Engels. Medium - medium golf), en L-tipe - in geel-rooi (L van Engels. Lang - langgolf) dele van die spektrum. Die teenwoordigheid van hierdie drie tipes keëls (en stokke wat sensitief is in die smaraggroen deel van die spektrum) gee 'n persoon kleurvisie. / ongeveer. vertaal]. Stokke, die ander tipe fotoreseptor in ons oë, is in staat om veranderinge in helderheid op te spoor, maar is baie meer sensitief vir kleur. Ons oë het ongeveer 120 miljoen stokke en net 6 miljoen keëls.

Daarom sien ons oë veranderinge in helderheid baie beter as veranderinge in kleur. As jy die kleur van die helderheid skei, kan jy 'n bietjie kleur verwyder, en niemand sal iets agterkom nie. Chroma-substeekproefneming is die proses om die kleurkomponente van 'n beeld teen 'n laer resolusie as die luminansiekomponente voor te stel. In die voorbeeld hierbo het elke pixel presies een Y-komponent, en elke individuele groep van vier pixels het presies een Cb- en een Cr-komponent. Daarom bevat die prent vier keer minder kleurinligting as die oorspronklike.

Die YCbCr-kleurruimte word nie net in JPEG's gebruik nie. Dit is oorspronklik in 1938 vir TV-programme uitgevind. Nie almal het 'n kleur-TV nie, so die skeiding van kleur en helderheid het almal toegelaat om dieselfde sein te kry, en TV's sonder kleur het net die helderheidskomponent gebruik.

Daarom vernietig die verwydering van een nommer uit die redigeerder alle kleure heeltemal. Komponente word gestoor in die vorm YYYY Cb Cr (in werklikheid, nie noodwendig in hierdie volgorde nie - die bergingsvolgorde word in die lêeropskrif gespesifiseer). Die verwydering van die eerste getal sal veroorsaak dat die eerste waarde van Cb geïnterpreteer word as Y, Cr as Cb, en in die algemeen sal 'n domino-effek verkry word, wat al die kleure van die prentjie verander.

Die JPEG-spesifikasie vereis nie dat jy YCbCr gebruik nie. Maar in die meeste lêers word dit gebruik omdat dit beter kwaliteit beelde gee na submonsterneming in vergelyking met RGB. Maar jy hoef nie my woord daarvoor te vat nie. Kyk self in die tabel hieronder hoe submonstering van elke individuele komponent in beide RGB en YCbCr sal lyk.

Hoe die JPEG-formaat werk
(Interaktiewe weergawe in oorspronklik artikels).

Die verwydering van blou is nie so opvallend soos rooi of groen nie. Dit is as gevolg van die ses miljoen keëls in jou oë, ongeveer 64% is sensitief vir rooi, 32% vir groen en 2% vir blou.

Die substeekproefneming van die Y-komponent (links onder) word die beste gesien. Selfs 'n klein verandering is merkbaar.

Die omskakeling van 'n prent van RGB na YCbCr verminder nie die lêergrootte nie, maar dit maak dit makliker om minder opvallende besonderhede te vind wat verwyder kan word. Lossy kompressie vind plaas in die tweede stadium. Dit is gebaseer op die idee om data in 'n meer saamdrukbare vorm aan te bied.

2. Diskrete kosinustransformasie en diskretisering

Hierdie vlak van kompressie definieer meestal die essensie van JPEG. Nadat die kleure na YCbCr omgeskakel is, word die komponente individueel saamgepers, dus kan ons voortaan net op die Y-komponent konsentreer. En hier is hoe die grepe van die Y-komponent lyk nadat hierdie vlak toegepas is.

Hoe die JPEG-formaat werk
(Interaktiewe weergawe in oorspronklik artikels). In die interaktiewe weergawe, deur op 'n pixel te klik, blaai die redigeerder na die lyn wat dit verteenwoordig. Probeer om getalle van die einde af te verwyder of voeg 'n paar nulle by 'n sekere getal.

Met die eerste oogopslag lyk dit na baie slegte kompressie. Daar is 100 000 pixels in 'n prent, en dit neem 102 400 getalle om hul helderheid (Y-komponente) aan te dui – dis erger as om glad niks saam te komprimeer nie!

Let egter daarop dat die meeste van hierdie getalle nul is. Boonop kan al hierdie nulle aan die einde van die lyne verwyder word sonder om die beeld te verander. Daar is ongeveer 26 000 nommers oor, wat amper 4 keer minder is!

Hierdie vlak bevat die geheim van skaakpatrone. Anders as ander effekte wat ons gesien het, is die voorkoms van hierdie patrone nie 'n fout nie. Hulle is die boustene van die hele beeld. Elke reël van die redigeerder bevat presies 64 getalle, diskrete cosinus transformasie (DCT) koëffisiënte wat ooreenstem met die intensiteite van 64 unieke patrone.

Hierdie patrone word gevorm op grond van die cosinus-plot. Hier is hoe sommige van hulle lyk:

Hoe die JPEG-formaat werk
8 uit 64 kans

Hieronder is 'n prent wat al 64 patrone wys.

Hoe die JPEG-formaat werk
(Interaktiewe weergawe in oorspronklik artikels).

Hierdie patrone is van besondere belang aangesien dit die basis vorm van die 8x8 beelde. As jy nie vertroud is met lineêre algebra nie, beteken dit dat enige 8x8 beeld uit hierdie 64 patrone verkry kan word. DCT is die proses om beelde in 8x8 blokke op te breek en elke blok in 'n kombinasie van hierdie 64 koëffisiënte om te skakel.

Die feit dat enige beeld uit 64 spesifieke patrone saamgestel kan word, lyk na towerkrag. Dit is egter dieselfde as om te sê dat enige plek op Aarde deur twee getalle beskryf kan word – breedtegraad en lengtegraad [wat die halfronde aandui / ongeveer. vertaal]. Ons dink dikwels aan die Aarde se oppervlak as tweedimensioneel, dus het ons net twee getalle nodig. 'n 8x8-prent het 64 afmetings, so ons het 64 nommers nodig.

Dit is nog nie duidelik hoe dit ons help in terme van kompressie nie. As ons 64 getalle nodig het om 'n 8x8-beeld voor te stel, hoekom sou dit beter wees as om net 64 luminansiekomponente te stoor? Ons doen dit om dieselfde rede waarom ons drie RGB-nommers in drie YCbCr-nommers verander het: dit laat ons toe om subtiele besonderhede te verwyder.

Dit is moeilik om te sien presies watter besonderhede op hierdie stadium verwyder word, want JPEG pas DCT op 8x8-blokke toe. Niemand verbied ons egter om dit op die hele prentjie toe te pas nie. Hier is hoe die DCT vir die Y-komponent lyk wanneer dit op die hele prentjie toegepas word:

Hoe die JPEG-formaat werk

Meer as 60 000 nommers kan van die einde verwyder word met feitlik geen merkbare veranderinge in die foto nie.

Hoe die JPEG-formaat werk

Let egter daarop dat as ons die eerste vyf getalle nul maak, die verskil duidelik sal wees.

Hoe die JPEG-formaat werk

Die getalle aan die begin verteenwoordig lae frekwensie veranderinge in die beeld, en ons oë tel hulle die beste op. Getalle na die einde dui hoëfrekwensieveranderinge aan wat moeiliker is om op te let. Om te "sien wat die oog nie kan sien nie", kan ons hierdie hoëfrekwensiebesonderhede isoleer deur die eerste 5000 nommers uit te nul.

Hoe die JPEG-formaat werk

Ons sien alle areas van die beeld waar die grootste verandering van pixel tot pixel plaasvind. Die oë van die kat, sy snorbaarde, die terrykombers en die skaduwees in die onderste linkerhoek staan ​​uit. Jy kan verder gaan deur die eerste 10 000 nommers uit te nul:

Hoe die JPEG-formaat werk

20 000 XNUMX:

Hoe die JPEG-formaat werk

40 000 XNUMX:

Hoe die JPEG-formaat werk

60 000 XNUMX:

Hoe die JPEG-formaat werk

Hierdie hoëfrekwensiebesonderhede word tydens die kompressiestadium deur JPEG verwyder. Die omskakeling van kleure na DCT-koëffisiënte is verliesloos. Verliese word gevorm by die steekproefstap, waar waardes van hoë frekwensie of naby aan nul verwyder word. Wanneer jy die kwaliteit van JPEG-besparing verlaag, verhoog die program die drempel vir die aantal waardes wat verwyder moet word, wat die lêergrootte verminder, maar die prentjie meer gepixel maak. Die beeld in die eerste afdeling, wat 57 keer kleiner was, het dus so gelyk. Elke 8x8-blok het 'n baie kleiner aantal DCT-koëffisiënte verteenwoordig in vergelyking met die hoër kwaliteit weergawe.

Jy kan iets so gaaf doen soos om beelde geleidelik te stroom. Jy kan 'n vaag prentjie vertoon wat meer en meer gedetailleerd word namate meer koëffisiënte afgelaai word.

Hier, net vir die pret, wat gebeur wanneer slegs 24 000 nommers gebruik word:

Hoe die JPEG-formaat werk

Of net 5000:

Hoe die JPEG-formaat werk

Baie vaag maar herkenbaar!

3. Kodering van lopielengtes, delta en Huffman

Tot dusver was alle stadiums van kompressie verliesloos. Die laaste fase, inteendeel, verloop sonder verlies. Dit verwyder nie inligting nie, maar verminder die lêergrootte aansienlik.

Hoe kan jy iets saamdruk sonder om inligting weg te gooi? Stel jou voor hoe ons 'n eenvoudige swart 700 x 437 reghoek sal beskryf.

JPEG gebruik 5000 nommers hiervoor, maar baie beter resultate kan behaal word. Kan jy jou 'n enkoderingskema voorstel wat so 'n beeld in so min as moontlik grepe beskryf?

Die minimale skema waarmee ek vorendag kan kom, gebruik vier: drie vir die kleur en 'n vierde vir hoeveel pixels daardie kleur het. Die idee om herhaalde waardes op so 'n saamgeperste manier voor te stel, word runlengte-kodering genoem. Dit is verliesloos omdat ons die geënkodeerde data in sy oorspronklike vorm kan herstel.

Die grootte van 'n JPEG-lêer met 'n swart reghoek is baie groter as 4 grepe - onthou dat op die DCT-vlak kompressie toegepas word op blokke van 8x8 pixels. Daarom benodig ons ten minste een DCT-koëffisiënt vir elke 64 pixels. Ons het een nodig, want in plaas daarvan om 'n enkele DCT-koëffisiënt gevolg deur 63 nulle te stoor, laat looplengte-kodering ons 'n enkele getal stoor en aandui "al die ander is nulle".

Delta-kodering is 'n tegniek waardeur elke greep 'n verskil van 'n waarde eerder as 'n absolute waarde bevat. Daarom verander die wysiging van sekere grepe die kleur van alle ander pixels. Byvoorbeeld, in plaas van stoor

12 13 14 14 14 13 13 14

Ons kan met 12 begin en dan net neerskryf hoeveel om by te tel of af te trek om die volgende getal te kry. En hierdie volgorde in delta-kodering neem die vorm aan:

12 1 1 0 0 -1 0 1

Die omgeskakelde data is nie kleiner as die oorspronklike data nie, maar dit is makliker om dit saam te pers. Die toepassing van delta-kodering voor looplengte-kodering kan baie help terwyl dit steeds verlieslose kompressie is.

Delta-kodering is een van die min tegnieke wat buite 8x8-blokke gebruik word. Van die 64 DCT-koëffisiënte is een bloot 'n konstante golffunksie (soliede kleur). Dit verteenwoordig die gemiddelde helderheid van elke blok vir die luminansiekomponente, of die gemiddelde blouheid vir die Cb-komponente, ensovoorts. Die eerste waarde van elke DCT-blok word die DC-waarde genoem, en elke DC-waarde is delta-gekodeer met betrekking tot die voriges. Daarom sal die verandering van die helderheid van die eerste blok alle blokke beïnvloed.

Die laaste raaisel bly: hoe bederf die verandering van die enkelvoud die hele prentjie heeltemal? Tot dusver het kompressievlakke nie sulke eienskappe gehad nie. Die antwoord lê in die JPEG-kopskrif. Die eerste 500 grepe bevat metadata oor die beeld – breedte, hoogte, ens., en tot dusver het ons nie daarmee gewerk nie.

Sonder 'n kopskrif is dit byna onmoontlik (wel, baie moeilik) om 'n JPEG te dekodeer. Dit sal lyk asof ek 'n prentjie vir jou probeer beskryf, en ek begin woorde uitdink om my indruk oor te dra. Die beskrywing sal waarskynlik baie bondig wees, aangesien ek woorde kan uitdink met presies die betekenis wat ek wil oordra, maar vir almal anders sal dit nie sin maak nie.

Klink dom, maar dit is presies wat gebeur. Elke JPEG-prent word saamgepers met kodes wat spesifiek daarvoor is. Die kodewoordeboek word in die kopskrif gestoor. Hierdie tegniek word "Huffman-kode" genoem en die woordeboek word Huffman-tabel genoem. In die kopskrif is die tabel met twee grepe gemerk - 255 en dan 196. Elke kleurkomponent kan sy eie tabel hê.

Tabelveranderinge sal enige beeld drasties beïnvloed. 'n Goeie voorbeeld is om 15 na 1 op die 12de reël te verander.

Hoe die JPEG-formaat werk

Dit is omdat die tabelle spesifiseer hoe individuele bisse gelees moet word. Tot dusver het ons net met binêre getalle in desimale vorm gewerk. Maar dit verberg vir ons die feit dat as jy die getal 1 in 'n greep wil stoor, dit soos 00000001 sal lyk, want elke greep moet presies agt bisse hê, al is net een van hulle nodig.

Dit is moontlik 'n groot vermorsing van spasie as jy baie klein getalle het. Huffman-kode is 'n tegniek wat ons toelaat om hierdie vereiste dat elke getal agt bisse moet beslaan, verslap. Dit beteken dat as jy twee grepe sien:

234 115

Dan, afhangende van die Huffman-tabel, kan dit drie getalle wees. Om hulle te onttrek, moet jy hulle eers in individuele stukkies verdeel:

11101010 01110011

Dan draai ons na die tabel om te verstaan ​​hoe om hulle te groepeer. Byvoorbeeld, dit kan die eerste ses bisse, (111010), of 58 in desimale wees, gevolg deur vyf bisse (10011), of 19, en uiteindelik die laaste vier bisse (0011), of 3.

Daarom is dit baie moeilik om die grepe op hierdie stadium van kompressie te verstaan. Die grepe verteenwoordig nie wat hulle lyk nie. Ek sal nie in hierdie artikel ingaan op die besonderhede van die werk met die tabel nie, maar van materiale oor hierdie kwessie aanlyn genoeg.

Een van die oulike truuks wat jy met hierdie kennis kan doen, is om die kopskrif van die JPEG te skei en dit apart te stoor. Trouens, dit blyk dat net jy die lêer kan lees. Facebook doen dit om lêers verder te verminder.

Wat nog gedoen kan word, is om die Huffman-tabel nogal te verander. Vir ander sal dit soos 'n bederfde prentjie lyk. En net jy sal die magiese opsie ken om dit reg te stel.

Om op te som: so wat is nodig om 'n JPEG te dekodeer? Nodig:

  1. Onttrek die Huffman-tabel(e) uit die kopskrif en dekodeer die stukkies.
  2. Onttrek die diskrete cosinus-transformasie-koëffisiënte vir elke kleur- en luminansiekomponent vir elke 8x8-blok deur die omgekeerde transformasie van looplengte-kodering en delta.
  3. Kombineer cosinus gebaseer op koëffisiënte om pixelwaardes vir elke 8x8-blok te kry.
  4. Skaal kleurkomponente as substeekproefneming uitgevoer is (hierdie inligting is in die kopskrif).
  5. Skakel die gevolglike YCbCr-waardes vir elke pixel om na RGB.
  6. Bring die beeld na die skerm!

Ernstige werk om bloot 'n foto saam met 'n kat te kyk! Wat ek egter daarvan hou, is dat dit wys hoe mensgesentreerd JPEG-tegnologie is. Dit is gebaseer op die kenmerke van ons persepsie, wat ons in staat stel om baie beter kompressie as konvensionele tegnologieë te bereik. En nou, as jy verstaan ​​hoe JPEG werk, kan jy jou voorstel hoe hierdie tegnologieë na ander gebiede oorgedra kan word. Delta-kodering in video kan byvoorbeeld lei tot 'n aansienlike vermindering in lêergrootte, aangesien daar dikwels hele areas is wat nie van raam tot raam verander nie (byvoorbeeld die agtergrond).

Kode wat in die artikel gebruik word, is oop en bevat instruksies om die prente met jou eie te vervang.

Bron: will.com

Voeg 'n opmerking