Hoe wurket it JPEG-formaat

JPEG-ôfbyldings binne oeral yn ús digitale libbens, mar efter dit fineer fan bewustwêzen binne algoritmen dy't details ferwiderje dy't net waarneember binne foar it minsklik each. It resultaat is de heechste fisuele kwaliteit yn 'e lytste triemgrutte - mar hoe krekt wurket it allegear? Lit ús sjen wat ús eagen krekt net sjogge!

Hoe wurket it JPEG-formaat

It is maklik om de mooglikheid te nimmen om in foto nei in freon te stjoeren en gjin soargen te meitsjen oer hokker apparaat, browser of bestjoeringssysteem se brûke - mar dat wie net altyd it gefal. Tsjin 'e iere 1980's koene kompjûters digitale ôfbyldings opslaan en werjaan, mar d'r wiene in protte konkurrearjende ideeën oer de bêste manier om dit te dwaan. Jo koenen net samar in ôfbylding fan de iene kompjûter nei de oare stjoere en hoopje dat it soe wurkje.

Om dit probleem op te lossen, waard yn 1986 in kommisje fan saakkundigen fan oer de hiele wrâld gearstald mei de namme "Joint Group of Photography Experts» (Joint Photographic Experts Group, JPEG), oprjochte as in mienskiplike ynspanning tusken de International Organization for Standardization (ISO) en de International Electrotechnical Commission (IEC), twa ynternasjonale noarmorganisaasjes mei haadkantoar yn Genève, Switserlân.

In groep minsken neamd JPEG makke yn 1992 de JPEG-standert foar kompresje fan digitale ôfbyldings. Elkenien dy't it ynternet hat brûkt hat wierskynlik JPEG-kodearre ôfbyldings tsjinkaam. Dit is de meast foarkommende manier om ôfbyldings te kodearjen, te ferstjoeren en op te slaan. Fan websiden oant e-post nei sosjale media, JPEG wurdt miljarden kearen deis brûkt - praktysk elke kear as wy in ôfbylding online besjen of ferstjoere. Sûnder JPEG soe it web minder kleurich, stadiger wêze en wierskynlik minder katfoto's hawwe!

Dit artikel giet oer hoe't jo in JPEG-ôfbylding kinne dekodearje. Mei oare wurden, wat is nedich om komprimearre gegevens opslein op in kompjûter te konvertearjen yn in ôfbylding dy't op it skerm ferskynt. Dit is it wurdich te witten, net allinich om't it wichtich is om de technology te begripen dy't wy elke dei brûke, mar ek om't wy troch it ûntsluten fan kompresjenivo's mear leare oer waarnimming en fisy, en foar hokker details ús eagen it meast gefoelich binne.

Boppedat is it boartsjen mei bylden op dizze manier tige nijsgjirrich.

Hoe wurket it JPEG-formaat

Sjoch yn JPEG

Op in kompjûter wurdt alles opslein as in folchoarder fan binêre sifers. Typysk binne dizze bits, nullen en enen, groepearre yn groepen fan acht om bytes te meitsjen. As jo ​​​​in JPEG-ôfbylding op in kompjûter iepenje, moat wat (in browser, in bestjoeringssysteem, wat oars) de bytes dekodearje, en it orizjinele byld weromsette as in list mei kleuren dy't werjûn wurde kinne.

As jo ​​download dizze swiete foto fan in kat en iepenje it yn in tekstbewurker, sille jo in boskje ûngearhingjende karakters sjen.

Hoe wurket it JPEG-formaat
Hjir brûk ik Notepad++ om de ynhâld fan it bestân te ûndersiikjen, om't gewoane tekstbewurkers lykas Notepad op Windows it binêre bestân nei it bewarjen sille korrumpeare en it sil net langer oan it JPEG-formaat foldwaan.

It iepenjen fan in ôfbylding yn in tekstferwurker betizet de kompjûter, krekt sa't jo jo harsens betize as jo yn 'e eagen wrijven en plakjes fan kleur begjinne te sjen!

Dizze plakken dy't jo sjogge binne bekend as fosfenen, en binne net it gefolch fan in ljocht stimulus of in hallusinaasje generearre troch de geast. Se komme foar om't jo harsens tinkt dat alle elektryske sinjalen yn 'e optyske senuwen ynformaasje oer ljocht oerbringe. It brein moat dizze oannames meitsje, om't d'r gjin manier is om te witten oft in sinjaal in lûd, in fisy of wat oars is. Alle nerven yn it lichem stjoere krekt deselde elektryske ympulsen oer. Troch druk op jo eagen út te oefenjen, stjoere jo sinjalen dy't net fisueel binne, mar aktivearje de receptors fan it each, dy't jo harsens ynterpretearje - yn dit gefal ferkeard - as wat fisueel. Jo kinne letterlik de druk sjen!

It is grappich om nei te tinken oer hoe ferlykbere kompjûters binne foar it brein, mar it is ek in nuttige analogy om te yllustrearjen hoefolle de betsjutting fan gegevens - oft it troch it lichem wurdt droegen troch senuwen of opslein op in kompjûter - hinget ôf fan har ynterpretaasje. Alle binêre gegevens binne opboud út XNUMX's en XNUMX's, de basiskomponinten dy't ynformaasje fan elke soart kinne oerbringe. Jo kompjûter fynt faak út hoe't se se ynterpretearje kinne troch oanwizings te brûken lykas bestânsútwreidings. No twinge wy it om se as tekst te ynterpretearjen, want dat ferwachtet de tekstbewurker.

Om te begripen hoe't jo JPEG dekodearje, moatte wy de orizjinele sinjalen sels sjen - de binêre gegevens. Dit kin dien wurde mei in heksadesimale bewurker, of direkt op orizjinele artikel webside! D'r is in ôfbylding, neist dêr't yn it tekstfjild al syn bytes binne (útsein de koptekst), presintearre yn desimale foarm. Jo kinne se feroarje, en it skript sil opnij kodearje en produsearje in nije ôfbylding op 'e flecht.

Hoe wurket it JPEG-formaat

Jo kinne in protte leare gewoan troch te boartsjen mei dizze bewurker. Kinne jo bygelyks fertelle yn hokker folchoarder de piksels wurde opslein?

It nuvere oan dit foarbyld is dat it feroarjen fan guon nûmers hielendal gjin ynfloed hat op it byld, mar as jo bygelyks it nûmer 17 ferfange troch 0 yn 'e earste rigel, sil de foto folslein ferneatige wurde!

Hoe wurket it JPEG-formaat

Oare feroarings, lykas it ferfangen fan de 7 on line 1988 mei it nûmer 254, feroaret de kleur, mar allinich fan folgjende piksels.

Hoe wurket it JPEG-formaat

Miskien is it frjemdste ding dat guon nûmers net allinich de kleur feroarje, mar ek de foarm fan it byld. Feroarje de 70 yn rigel 12 nei 2 en sjoch nei de boppeste rige fan 'e ôfbylding om te sjen wat ik bedoel.

Hoe wurket it JPEG-formaat

En hokker JPEG-ôfbylding jo ek brûke, jo sille altyd dizze mysterieuze skaakpatroanen fine by it bewurkjen fan de bytes.

By it boartsjen mei de bewurker is it lestich om te begripen hoe't in foto wurdt opnij makke fan dizze bytes, om't JPEG-kompresje bestiet út trije ferskillende technologyen, sequentieel tapast yn nivo's. Wy sille elk apart studearje om it mysterieuze gedrach te ûntdekken dat wy sjogge.

Trije nivo's fan JPEG-kompresje:

  1. Kleur subsampling.
  2. Diskrete cosinustransformaasje en sampling.
  3. Run lingte kodearring, delta и Huffman

Om jo in idee te jaan oer de omfang fan 'e kompresje, tink derom dat de ôfbylding hjirboppe 79 nûmers fertsjintwurdiget, of sawat 819 KB. As wy it sûnder kompresje opslaan, soe elke piksel trije nûmers nedich wêze - foar de reade, griene en blauwe komponinten. Dit soe 79 nûmers bedrage, of sawat. 917 kb. As gefolch fan JPEG-kompresje waard it definitive bestân mei mear dan 700 kear fermindere!

Yn feite kin dizze ôfbylding folle mear komprimearre wurde. Hjirûnder binne twa ôfbyldings njonken inoar - de foto oan 'e rjochterkant is komprimearre ta 16 KB, dat is 57 kear lytser as de net-komprimeare ferzje!

Hoe wurket it JPEG-formaat

As jo ​​goed sjogge, sille jo sjen dat dizze ôfbyldings net identyk binne. Beide binne ôfbyldings mei JPEG-kompresje, mar de rjochter is folle lytser yn folume. It sjocht der ek wat slimmer út (sjoch nei de eftergrûnkleurfjilden). Dêrom wurdt JPEG ek wol lossy compression neamd; Tidens it kompresjeproses feroaret it byld en ferliest guon details.

1. Kleur subsampling

Hjir is in ôfbylding mei allinich it earste nivo fan kompresje tapast.

Hoe wurket it JPEG-formaat
(Ynteraktive ferzje - yn oarspronklik artikels). It fuortsmiten fan ien nûmer ferneatiget alle kleuren. As presys seis nûmers lykwols fuorthelle wurde, hat it frijwol gjin effekt op de ôfbylding.

No binne de nûmers wat makliker te ûntsiferjen. Dit is hast in ienfâldige list mei kleuren, wêryn elke byte krekt ien piksel feroaret, mar tagelyk is it al de helte fan 'e grutte fan' e net-komprimeare ôfbylding (wat sa'n 300 KB soe nimme yn dizze fermindere grutte). Kinne jo riede wêrom?

Jo kinne sjen dat dizze nûmers de standert reade, griene en blauwe komponinten net fertsjintwurdigje, om't as wy alle nûmers ferfange troch nullen, sille wy in griene ôfbylding krije (ynstee fan wyt).

Hoe wurket it JPEG-formaat

Dit komt omdat dizze bytes stean foar Y (helderheid),

Hoe wurket it JPEG-formaat

Cb (relatyf blauheid),

Hoe wurket it JPEG-formaat

en Cr (relative roodheid) pictures.

Hoe wurket it JPEG-formaat

Wêrom net RGB brûke? Ommers, dit is hoe't de measte moderne skermen wurkje. Jo monitor kin elke kleur werjaan, ynklusyf read, grien en blau, mei ferskate yntensiteiten foar elke piksel. Wyt wurdt krigen troch alle trije op folsleine helderheid te draaien, en swart troch se út te skeakeljen.

Hoe wurket it JPEG-formaat

Dit is ek heul gelyk oan hoe't it minsklik each wurket. De kleurreceptors yn ús eagen wurde neamd "kegels", en binne ferdield yn trije soarten, elk fan dy is gefoeliger foar reade, griene of blauwe kleuren [S-type kegels binne gefoelich yn it fioeleblau (S fan it Ingelske Koarte - koarte-golfspektrum), M -type - yn 'e grien-giel (M fan' e Ingelske Medium - medium-wave), en L-type - yn 'e giel-read (L fan' e Ingelske Long - long-wave) dielen fan it spektrum. De oanwêzigens fan dizze trije soarten kegels (en roeden, dy't gefoelich binne yn it smaragdgriene diel fan it spektrum) jout in persoan kleurfisy. / ca. oers.]. Sticks, in oar type fotoreceptor yn ús eagen, is by steat om feroarings yn helderheid te detektearjen, mar is folle gefoeliger foar kleur. Us eagen hawwe sa'n 120 miljoen stokken en mar 6 miljoen kegels.

Dit is de reden dat ús eagen folle better binne by it detectearjen fan feroaringen yn helderheid dan feroaringen yn kleur. As jo ​​skiede kleur fan helderheid, kinne jo fuortsmite in bytsje kleur en gjinien sil fernimme neat. Chroma subsampling is it proses fan it fertsjintwurdigjen fan de kleurkomponinten fan in ôfbylding mei in legere resolúsje dan de luminânsjekomponinten. Yn it foarbyld hjirboppe hat elke piksel krekt ien Y-komponint, en elke yndividuele groep fan fjouwer piksels hat krekt ien Cb- en ien Cr-komponint. Dêrom befettet de ôfbylding fjouwer kear minder kleurynformaasje as it orizjineel.

De YCbCr-kleurromte wurdt net allinich brûkt yn JPEG. It waard oarspronklik útfûn yn 1938 foar televyzjeprogramma's. Net elkenien hat in kleuren-tv, dus it skieden fan kleur en helderheid koe elkenien itselde sinjaal krije, en TV's sûnder kleur brûkten gewoan allinich de helderheidskomponint.

Sa it fuortheljen fan ien nûmer út de bewurker ferneatiget alle kleuren folslein. De komponinten wurde opslein yn 'e foarm YYYY Cb Cr (feitlik net needsaaklik yn dy folchoarder - de opslachfolchoarder wurdt oanjûn yn' e triemkoptekst). It fuortheljen fan it earste nûmer sil feroarsaakje dat de earste wearde fan Cb wurdt waarnommen as Y, Cr as Cb, en yn 't algemien sille jo in domino-effekt hawwe dat alle kleuren fan' e foto skeakelt.

De JPEG-spesifikaasje twingt jo net om YCbCr te brûken. Mar de measte bestannen brûke it om't it bettere downsamplede ôfbyldings produseart dan RGB. Mar jo moatte myn wurd der net foar nimme. Sjoch foar josels yn 'e tabel hjirûnder hoe subsampling fan elke yndividuele komponint der útsjen sil yn sawol RGB as YCbCr.

Hoe wurket it JPEG-formaat
(Ynteraktive ferzje - yn oarspronklik artikels).

It fuortheljen fan blau is net sa merkber as dy fan read of grien. Dat komt troch de seis miljoen kegels yn jo eagen, sa'n 64% is gefoelich foar read, 32% foar grien en 2% foar blau.

De downsampling fan 'e Y-komponint (linksûnder) is it bêste te sjen. Sels in lytse feroaring is te fernimmen.

It konvertearjen fan in ôfbylding fan RGB nei YCbCr ferminderet de triemgrutte net, mar it makket it makliker om minder sichtbere details te finen dy't kinne wurde fuortsmiten. Lossy kompresje komt yn de twadde etappe. It is basearre op it idee fan it presintearjen fan gegevens yn in mear kompressibele foarm.

2. Diskrete cosinus transformaasje en sampling

Dit nivo fan kompresje is foar it grutste part wêr't JPEG oer giet. Nei it konvertearjen fan de kleuren nei YCbCr, wurde de komponinten yndividueel komprimearre, sadat wy dan allinich op 'e Y-komponint konsintrearje kinne. En hjir is hoe't de Y-komponintbytes der útsjen nei it oanbringen fan dizze laach.

Hoe wurket it JPEG-formaat
(Ynteraktive ferzje - yn oarspronklik artikels). Yn 'e ynteraktive ferzje, klikje op in piksel rôlet de bewurker nei de line dy't it fertsjintwurdiget. Besykje nûmers fan 'e ein te ferwiderjen of in pear nullen ta te foegjen oan in bepaald oantal.

Op it earste each liket it op in heul minne kompresje. D'r binne 100 piksels yn in ôfbylding, en it duorret 000 nûmers om har helderheid (Y-komponinten) foar te stellen - dat is slimmer dan hielendal neat te komprimearjen!

Tink derom dat de measte fan dizze nûmers nul binne. Boppedat kinne al dy nullen oan 'e ein fan rigels fuortsmiten wurde sûnder de ôfbylding te feroarjen. D'r binne sawat 26 nûmers oer, en dit is hast 000 kear minder!

Dit nivo befettet it geheim fan skaakpatroanen. Oars as oare effekten dy't wy hawwe sjoen, is it uterlik fan dizze patroanen gjin glitch. Se binne de boustiennen fan it hiele byld. Eltse line fan de bewurker befettet presys 64 nûmers, diskrete cosinus transform (DCT) koeffizienten oerienkommende mei de yntinsiteit fan 64 unike patroanen.

Dizze patroanen wurde foarme basearre op it cosinusplot. Hjir is hoe't guon fan harren der útsjen:

Hoe wurket it JPEG-formaat
8 fan 64 odds

Hjirûnder is in ôfbylding mei alle 64 patroanen.

Hoe wurket it JPEG-formaat
(Ynteraktive ferzje - yn oarspronklik artikels).

Dizze patroanen binne fan bysûnder belang, om't se de basis foarmje fan 'e 8x8-ôfbyldings. As jo ​​​​net bekend binne mei lineêre algebra, betsjut dit dat elke 8x8-ôfbylding kin wurde makke fan dizze 64 patroanen. DCT is it proses fan it dielen fan ôfbyldings yn 8x8 blokken en it konvertearjen fan elk blok yn in kombinaasje fan dizze 64 koeffizienten.

It liket magy dat elke ôfbylding kin wurde gearstald út 64 spesifike patroanen. Dit is lykwols itselde as te sizzen dat elk plak op ierde kin wurde beskreaun troch twa nûmers - breedtegraad en lingtegraad [oanjout healrûnen / ca. oers.]. Wy tinke faak oan it ierdoerflak as twadiminsjonaal, dus wy hawwe mar twa nûmers nedich. In 8x8-ôfbylding hat 64 diminsjes, dus wy hawwe 64 nûmers nedich.

It is noch net dúdlik hoe't dit ús helpt yn termen fan kompresje. As wy 64 nûmers nedich binne om in 8x8-ôfbylding te fertsjintwurdigjen, wêrom soe dit better wêze dan gewoan opslaan fan 64-helderheidskomponinten? Wy dogge dit om deselde reden dat wy trije RGB-nûmers omset hawwe yn trije YCbCr-nûmers: it lit ús subtile details fuortsmite.

It is lestich om krekt te sjen hokker detail op dit stadium wurdt fuortsmiten, om't JPEG DCT tapast op 8x8-blokken. Nimmen ferbiedt ús lykwols om it ta te passen op it hiele byld. Hjir is hoe DCT derút sjocht foar de Y-komponint tapast op it heule byld:

Hoe wurket it JPEG-formaat

Mear dan 60 nûmers kinne fan 'e ein fuortsmiten wurde mei praktysk gjin merkbere feroarings oan' e foto.

Hoe wurket it JPEG-formaat

Tink derom dat as wy de earste fiif nûmers nullje, sil it ferskil dúdlik wêze.

Hoe wurket it JPEG-formaat

De sifers oan it begjin fertsjintwurdigje lege frekwinsje feroarings yn 'e ôfbylding, dy't ús eagen it bêste opnimme. Sifers nei it ein oan jouwe feroaringen yn 'e hege frekwinsjes oan dy't dreger te merken binne. Om "sjen wat it each net kin sjen," kinne wy ​​​​dizze hege frekwinsje details isolearje troch de earste 5000 nûmers op nul te meitsjen.

Hoe wurket it JPEG-formaat

Wy sjogge alle gebieten fan 'e ôfbylding wêr't de grutste feroaring foarkomt fan piksel nei piksel. De eagen fan de kat, syn snorharken, de badstoftekken en de skaden yn de linker ûnderhoeke steane der op. Jo kinne fierder gean troch de earste 10 nûmers op nul te meitsjen:

Hoe wurket it JPEG-formaat

20 000:

Hoe wurket it JPEG-formaat

40 000:

Hoe wurket it JPEG-formaat

60 000:

Hoe wurket it JPEG-formaat

Dizze hege frekwinsje details wurde fuortsmiten troch JPEG tidens de kompresje poadium. D'r is gjin ferlies yn it konvertearjen fan kleuren nei DCT-koëffisjinten. Ferlies komt foar by de samplingstap, wêrby't hege frekwinsje of near-nul wearden wurde fuortsmiten. As jo ​​​​de JPEG-opslachkwaliteit ferleegje, fergruttet it programma de drompel foar it oantal ferwidere wearden, wat de triemgrutte ferminderet, mar makket de ôfbylding mear pikseleare. Dêrom seach it byld yn it earste diel, dat 57 kear lytser wie, der sa út. Elk 8x8-blok waard fertsjintwurdige troch folle minder DCT-koëffisjinten yn ferliking mei de ferzje fan hegere kwaliteit.

Jo kinne sa'n cool effekt oanmeitsje as de graduele streaming fan ôfbyldings. Jo kinne in wazige ôfbylding werjaan dy't hieltyd mear detaillearre wurdt as mear en mear koeffizienten wurde ynladen.

Hjir, gewoan foar de wille, is wat jo krije mei mar 24 nûmers:

Hoe wurket it JPEG-formaat

Of gewoan 5000:

Hoe wurket it JPEG-formaat

Hiel wazig, mar op ien of oare manier werkenber!

3. Run lingte kodearring, delta en Huffman

Oant no hawwe alle stadia fan kompresje ferlies west. De lêste etappe, krekt oarsom, giet sûnder ferliezen. It wisket gjin ynformaasje, mar it ferminderet de triemgrutte signifikant.

Hoe kinne jo wat komprimearje sûnder ynformaasje fuort te smiten? Stel jo foar hoe't wy in ienfâldige swarte rjochthoek 700 x 437 soene beskriuwe.

JPEG brûkt 5000 nûmers foar dit, mar folle bettere resultaten kinne wurde berikt. Kinne jo jo in kodearringskema foarstelle dat sa'n ôfbylding yn sa min mooglik bytes beskriuwt?

It minimale skema dat ik opkomme koe, brûkt fjouwer: trije om in kleur foar te stellen, en in fjirde om oan te jaan hoefolle piksels dy kleur hat. It idee om werheljende wearden op dizze kondinsearre manier te fertsjintwurdigjen wurdt run-lingte-kodearring neamd. It is lossless omdat wy kinne weromsette de kodearre gegevens yn syn oarspronklike foarm.

In JPEG-bestân mei in swarte rjochthoek is folle grutter dan 4 bytes - tink derom dat op DCT-nivo kompresje wurdt tapast op 8x8 pikselblokken. Dêrom hawwe wy op syn minst ien DCT-koëffisjint nedich foar elke 64 piksels. Wy moatte ien omdat ynstee fan in bewarjen ien DCT-koëffisjint folge troch 63 nullen, kinne run lingte kodearring ús te bewarjen ien getal en oanjaan dat "alle oaren binne nullen."

Delta kodearring is in technyk wêryn elke byte befettet in ferskil fan guon wearde, ynstee fan in absolute wearde. Dêrom feroaret it bewurkjen fan bepaalde bytes de kleur fan alle oare piksels. Bygelyks, ynstee fan opslaan

12 13 14 14 14 13 13 14

Wy kinne begjinne mei 12 en dan gewoan oanjaan hoefolle wy moatte tafoegje of ôflûke om it folgjende nûmer te krijen. En dizze folchoarder yn delta kodearring nimt de foarm:

12 1 1 0 0 -1 0 1

De konvertearre gegevens is net lytser as de orizjinele gegevens, mar it is makliker om it te komprimearjen. It tapassen fan delta-kodearring foar kodearring foar runlange kin in protte helpe, wylst se noch ferliesleaze kompresje binne.

Delta-kodearring is ien fan de pear techniken brûkt bûten 8x8 blokken. Fan 'e 64 DCT-koëffisjinten is ien gewoan in konstante golffunksje (bêste kleur). It fertsjintwurdiget de gemiddelde helderheid fan elk blok foar de luma-komponinten, as de gemiddelde blauens foar de Cb-komponinten, ensfh. De earste wearde fan elk DCT-blok wurdt de DC-wearde neamd, en elke DC-wearde wurdt delta kodearre mei respekt foar de foarige. Dêrom sil it feroarjen fan de helderheid fan it earste blok alle blokken beynfloedzje.

It lêste mystearje bliuwt: hoe ferneatiget it feroarjen fan it iental it hiele byld folslein? Oant no hawwe kompresjenivo's sokke eigenskippen net hân. It antwurd leit yn 'e JPEG-koptekst. De earste 500 bytes befetsje metadata oer de ôfbylding - breedte, hichte, ensfh., En wy hawwe noch net mei har wurke.

Sûnder in koptekst is it hast ûnmooglik (of heul lestich) om JPEG te ûntsiferjen. It sil der útsjen as besykje ik jo de foto te beskriuwen, en ik begjin wurden út te finen om myn yndruk oer te bringen. De beskriuwing sil nei alle gedachten nochal gearfette wurde, om't ik wurden kin útfine mei krekt de betsjutting dy't ik oerbringe wol, mar foar alle oaren sille se gjin sin hawwe.

It klinkt dom, mar dat is krekt wat der bart. Elke JPEG-ôfbylding wurdt komprimearre mei koades spesifyk dêrfoar. It koadewurdboek wurdt opslein yn 'e koptekst. Dizze technyk wurdt neamd Huffman koade en de wurdskat hjit Huffman tabel. Yn de koptekst is de tabel markearre mei twa bytes - 255 en dan 196. Elke kleurkomponint kin in eigen tabel hawwe.

Feroarings oan tabellen sille radikaal ynfloed hawwe op elke ôfbylding. In goed foarbyld is om de 15e rigel te feroarjen yn 1.

Hoe wurket it JPEG-formaat

Dit bart omdat de tabellen oantsjutte hoe't yndividuele bits moatte wurde lêzen. Oant no hawwe wy allinich wurke mei binêre getallen yn desimale foarm. Mar dit ferberget foar ús it feit dat as jo it getal 1 yn in byte opslaan wolle, it liket op 00000001, om't elke byte krekt acht bits hawwe moat, sels as der mar ien fan nedich is.

Dit is mooglik in grutte fergriemerij fan romte as jo in protte lytse nûmers. Huffman koade is in technyk wêrmei ús te ûntspannen dizze eask dat elk getal moat besette acht bits. Dit betsjut dat as jo twa bytes sjogge:

234 115

Dan, ôfhinklik fan 'e Huffman-tabel, kinne dit trije nûmers wêze. Om se te ekstrahearjen, moatte jo se earst yn yndividuele bits brekke:

11101010 01110011

Dan sjogge wy nei de tabel om út te finen hoe't se se groepearje. Dit kin bygelyks de earste seis bits wêze, (111010), of 58 yn desimaal, folge troch fiif bits (10011), of 19, en úteinlik de lêste fjouwer bits (0011), of 3.

Dêrom is it heul lestich om de bytes te begripen yn dit stadium fan kompresje. Bytes fertsjintwurdigje net wat se lykje. Ik sil net gean yn details fan wurkjen mei de tafel yn dit artikel, mar materialen oer dizze kwestje online is genôch.

Ien nijsgjirrige trúk dy't jo kinne dwaan mei dizze kennis is om de koptekst te skieden fan 'e JPEG en it apart op te slaan. Yn feite docht bliken dat allinich jo it bestân lêze kinne. Facebook docht dit om bestannen noch lytser te meitsjen.

Wat oars kin dien wurde is de Huffman-tafel nochal wat te feroarjen. Foar oaren sil it lykje as in brutsen foto. En allinich jo sille de magyske manier witte om it te reparearjen.

Litte wy gearfetsje: dus wat is nedich om JPEG te ûntsiferjen? Needsaaklik:

  1. Pake de Huffman-tabel (en) út 'e koptekst en dekodearje de bits.
  2. Ekstrahearje de diskrete cosinustransformaasjekoëffisjinten foar elke kleur- en luminânsjekomponint foar elk 8x8-blok, útfiere inverse run-lingte- en delta-kodearringstransformaasjes.
  3. Kombinearje cosinus basearre op koeffizienten om pikselwearden te krijen foar elk 8x8 blok.
  4. Skaal kleurkomponinten as subsampling waard útfierd (dizze ynformaasje is yn 'e koptekst).
  5. Konvertearje de resultearjende YCbCr-wearden foar elke piksel nei RGB.
  6. Toan de ôfbylding op it skerm!

Serieus wurk foar it gewoan besjen fan in foto mei in kat! Wat ik lykwols leuk fyn, is dat it lit sjen hoe't minsklik-sintraal JPEG-technology is. It is basearre op 'e eigenaardichheden fan ús waarnimming, wêrtroch't wy folle bettere kompresje kinne berikke dan konvinsjonele technologyen. En no't wy begripe hoe't JPEG wurket, kinne wy ​​ús yntinke hoe't dizze technologyen kinne wurde oerbrocht nei oare gebieten. Bygelyks, delta-kodearring yn fideo kin in signifikante fermindering fan triemgrutte leverje, om't d'r faak hiele gebieten binne dy't net feroarje fan frame nei frame (bygelyks de eftergrûn).

Koade brûkt yn it artikel, is iepen, en befettet ynstruksjes oer hoe't jo de foto's kinne ferfange troch jo eigen.

Boarne: www.habr.com

Add a comment