Kiel funkcias la JPEG-formato

JPEG-bildoj estas ĉieaj en niaj ciferecaj vivoj, sed malantaŭ tiu mantelo de konscio kaŝiĝas algoritmoj, kiuj forigas detalojn, kiujn la homa okulo ne povas vidi. La rezulto estas la plej alta vida kvalito en la plej malgranda dosiergrandeco - sed kiel precize ĉio funkcias? Ni vidu, kion precize niaj okuloj ne vidas!

Kiel funkcias la JPEG-formato

Estas facile preni por koncedite la kapablon sendi foton al amiko kaj ne zorgi pri kia aparato, retumilo aŭ operaciumo ili uzas - sed tio ne ĉiam estis la kazo. De la fruaj 1980-aj jaroj, komputiloj povis stoki kaj montri ciferecajn bildojn, sed ekzistis multaj konkurantaj ideoj pri la plej bona maniero fari tion. Vi ne povus simple sendi bildon de unu komputilo al alia kaj esperi ke ĝi funkciis.

Por solvi ĉi tiun problemon, komitato de spertuloj el la tuta mondo estis kunvenita en 1986 sub la nomo "Komuna Grupo de Fotografiaj Fakuloj” (Joint Photographic Experts Group, JPEG), fondita kadre de la komuna laboro de la Internacia Organizo por Normigado (ISO) kaj la Internacia Elektroteknika Komisiono (IEC), du internaciaj normorganizoj kun sidejo en Ĝenevo (Svislando).

Grupo de homoj nomitaj JPEG kreis la JPEG-ciferecan bildkunpremadnormon en 1992. Ĉiu, kiu uzis la Interreton, verŝajne renkontis JPEG-kodigitajn bildojn. Ĉi tio estas la plej ofta maniero por kodi, sendi kaj konservi bildojn. De retpaĝoj ĝis retpoŝto ĝis sociaj amaskomunikiloj, JPEG estas uzata miliardoj da fojoj tage - preskaŭ ĉiufoje kiam ni rigardas aŭ sendas bildon interrete. Sen JPEG-oj, la reto estus malpli hela, pli malrapida, kaj verŝajne havus malpli da kataj bildoj!

Ĉi tiu artikolo temas pri kiel malkodi JPEG-bildon. Alivorte, pri kio necesas por konverti kunpremitajn datumojn konservitajn en komputilo en bildon, kiu aperas sur la ekrano. Ĉi tio indas scii pri tio, ne nur ĉar ĝi gravas por kompreni la teknologion, kiun ni uzas ĉiutage, sed ankaŭ ĉar malkaŝante la nivelojn de kunpremado, ni pli bone scios percepton kaj vizion, kaj ankaŭ kiajn detalojn estas niaj okuloj plej. sentema al.

Krome, estas tre interese ludi kun bildoj tiamaniere.

Kiel funkcias la JPEG-formato

Rigardante ene de JPEG

En komputilo, ĉio estas konservita kiel sekvenco de binaraj nombroj. Kutime ĉi tiuj bitoj, nuloj kaj unoj, estas grupigitaj en ok, konsistigante bajtojn. Kiam vi malfermas JPEG-bildon en via komputilo, io (retumilo, operaciumo, kio ajn) devas malkodi la bajtojn, restarigante la originalan bildon kiel liston de koloroj, kiuj povas esti montrataj.

Se vi elŝutas ĉi belan foto de kato kaj malfermu ĝin en tekstredaktilo, vi vidos amason da miksitaj signoj.

Kiel funkcias la JPEG-formato
Ĉi tie mi uzas Notepad++ por inspekti la enhavon de la dosiero, ĉar oftaj tekstredaktiloj kiel Notepad de Vindozo fuŝos la binaron post konservado de ĝi kaj ĝi ne taŭgos la JPEG-formaton.

Malfermi bildon en tekstredaktilo konfuzas vian komputilon, same kiel vi konfuzas vian cerbon kiam vi frotas viajn okulojn kaj komencas vidi kolorajn makulojn!

Ĉi tiuj lokoj, kiujn vi vidas, estas konataj kiel fosfenoj, kaj ne estas la rezulto de eksponiĝo al malpeza stimulo aŭ halucinoj generitaj de la menso. Ili okazas ĉar via cerbo opinias, ke iuj elektraj signaloj en la optikaj nervoj portas informojn pri lumo. La cerbo bezonas fari tiajn supozojn, ĉar ne ekzistas maniero scii ĉu la signalo estas sono, vizio aŭ io alia. Ĉiuj nervoj en la korpo transdonas ĝuste la samajn elektrajn impulsojn. Kiam vi premas viajn okulojn, vi sendas signalojn, kiuj ne estas vidaj, sed aktivigas ricevilojn en la okulo, kiujn via cerbo interpretas—en ĉi tiu kazo, malĝuste—kiel ion vidan. Vi povas laŭvorte vidi la premon!

Estas amuze pensi pri kiom similaj komputiloj estas al la cerbo, sed ĝi ankaŭ estas utila analogio, ilustrante kiom la signifo de datumoj - ĉu portataj tra la korpo per nervoj aŭ konservitaj en komputilo - dependas de kiel ĝi estas interpretata. Ĉiuj binaraj datumoj konsistas el XNUMXs kaj XNUMXs, bazaj komponantoj kapablaj transdoni ajnan specon de informo. Via komputilo ofte divenas kiel interpreti ilin uzante indicojn kiel dosiero-etendoj. Nun ni faras ĝin interpreti ilin kiel tekston, ĉar tion atendas la tekstredaktilo.

Por kompreni kiel malkodi JPEG, ni devas vidi la originalajn signalojn mem - la binarajn datumojn. Ĉi tio povas esti farita per heksredaktilo, aŭ rekte sur retpaĝo de la originala artikolo! Estas bildo, apud kiu en la teksta kampo ĉiuj ĝiaj bajtoj (krom la kaplinio) estas prezentitaj en dekuma formo. Vi povas ŝanĝi ilin kaj la skripto rekodos kaj produktos novan bildon sur la flugo.

Kiel funkcias la JPEG-formato

Vi povas lerni multon nur ludante kun ĉi tiu redaktilo. Ekzemple, ĉu vi povas diri en kiu ordo la pikseloj estas stokitaj?

En ĉi tiu ekzemplo, la stranga afero estas, ke ŝanĝi iujn nombrojn tute ne influas la bildon, kaj, ekzemple, se vi anstataŭigas la numeron 17 per 0 en la unua linio, tiam la foto estos tute ruinigita!

Kiel funkcias la JPEG-formato

Aliaj ŝanĝoj, kiel ŝanĝi la 7 en linio 1988 al 254, ŝanĝas la koloron, sed nur postajn pikselojn.

Kiel funkcias la JPEG-formato

Eble la plej stranga afero estas, ke iuj nombroj ŝanĝas ne nur la koloron, sed ankaŭ la formon de la bildo. Ŝanĝu 70 en linio 12 al 2 kaj rigardu la supran vicon de la bildo por vidi kion mi volas diri.

Kiel funkcias la JPEG-formato

Kaj negrave kian JPEG-bildon vi uzas, vi ĉiam trovos tiujn kriptajn ŝakajn ŝablonojn dum redaktado de bajtoj.

Ludante kun la redaktilo, estas malfacile eltrovi kiel rekrei foton el ĉi tiuj bajtoj, ĉar JPEG-kunpremado konsistas el tri malsamaj teknologioj, kiuj estas aplikataj sinsekve en niveloj. Ni studos ĉiun el ili aparte por malkovri la misteran konduton, kiun ni observas.

Tri niveloj de JPEG-kunpremado:

  1. Kolorsubspecimenado.
  2. Diskreta Kosinusa Transformo kaj Diskretigo.
  3. Kura longokodigo, delto и huffman

Por doni al vi ideon pri la skalo de la kunpremo, notu, ke la supra bildo reprezentas 79 nombrojn, kio estas ĉirkaŭ 819 KB. Se ni stokus ĝin sen kunpremado, ni bezonus tri nombrojn por ĉiu pikselo - por la ruĝa, verda kaj blua komponantoj. Tio sumiĝos al 79 nombroj, aŭ ĉ. 917 Kb. Kiel rezulto de JPEG-kunpremado, la fina dosiero malpliiĝis je pli ol 700 fojojn!

Fakte, ĉi tiu bildo povas esti kunpremita multe pli. Malsupre estas du bildoj unu apud la alia - la foto dekstre estis kunpremita al 16 KB, tio estas, 57 fojojn malpli ol la nekunpremita versio!

Kiel funkcias la JPEG-formato

Se vi rigardas atente, vi vidos, ke ĉi tiuj bildoj ne estas identaj. Ambaŭ estas bildoj kun JPEG-kunpremo, sed la ĝusta estas multe pli malgranda laŭ volumeno. Ĝi ankaŭ aspektas iom pli malbona (rigardu la fonkolorajn kvadratojn). Tial, JPEG ankaŭ estas nomita perda kunpremo; dum la kunprema procezo, la bildo ŝanĝiĝas kaj perdas kelkajn detalojn.

1. Kolora subspecimenado

Jen bildo kun nur la unua nivelo de kunpremo aplikata.

Kiel funkcias la JPEG-formato
(Interaga versio en originala artikoloj). Forigi unu nombron detruas ĉiujn kolorojn. Tamen, se ekzakte ses nombroj estas forigitaj, ĝi havas malmulte al neniu efiko al la bildo.

Nun la nombroj estas iom pli facile deĉifreblaj. Ĉi tio estas preskaŭ simpla listo de koloroj, ĉiu bajto ŝanĝas ĝuste unu pikselon, sed ĝi jam estas duono de la grandeco de nekunpremita bildo (kiu prenus ĉ. 300 KB en tia reduktita grandeco). Divenu kial?

Vi povas vidi, ke ĉi tiuj nombroj ne reprezentas la normajn ruĝajn, verdajn kaj bluajn komponantojn, ĉar se ni anstataŭigas ĉiujn nombrojn per nuloj, ni ricevas verdan bildon (ne blankan).

Kiel funkcias la JPEG-formato

Ĉi tio estas ĉar ĉi tiuj bajtoj signifas Y (brileco),

Kiel funkcias la JPEG-formato

Cb (relativa bluo),

Kiel funkcias la JPEG-formato

kaj Cr (relativa ruĝeco) bildoj.

Kiel funkcias la JPEG-formato

Kial ne uzi RGB? Post ĉio, jen kiel plej modernaj ekranoj funkcias. Via monitoro povas montri ajnan koloron, inkluzive de ruĝa, verda kaj blua je malsamaj intensoj por ĉiu pikselo. Blanko estas akirita ŝaltante ĉiujn tri ĉe plena brilo, kaj nigra malŝaltas ilin.

Kiel funkcias la JPEG-formato

Ĝi ankaŭ estas tre simila al kiel funkcias la homa okulo. La koloraj riceviloj en niaj okuloj nomiĝas "konusoj", kaj estas dividitaj en tri tipojn, ĉiu el kiuj estas pli sentema al aŭ ruĝaj, aŭ verdaj, aŭ bluaj koloroj [S-tipaj konusoj estas sentemaj en viol-bluo (S el la angla. Mallonga - mallonga ondolonga spektro), M-tipo - en verd-flava (M el la angla. Meza - meza ondo), kaj L-speco - en flavruĝaj (L el la angla. Long - long-onda) partoj de la spektro. La ĉeesto de ĉi tiuj tri specoj de konusoj (kaj bastonoj sentemaj en la smeraldverda parto de la spektro) donas al homo kolorvizion. / ĉ. transl.]. Bastonoj, la alia speco de fotoreceptoro en niaj okuloj, kapablas detekti ŝanĝojn en brileco sed estas multe pli sentema al koloro. Niaj okuloj havas ĉirkaŭ 120 milionojn da bastonoj kaj nur 6 milionojn da konusoj.

Tial niaj okuloj rimarkas ŝanĝojn en brileco multe pli bone ol ŝanĝoj en koloro. Se vi apartigas la koloron de la brilo, vi povas forigi iom da koloro kaj neniu rimarkos ion ajn. Chroma subspecimenigo estas la procezo de reprezentado de la kolorkomponentoj de bildo kun pli malalta rezolucio ol la lumeckomponentoj. En la supra ekzemplo, ĉiu pikselo havas ekzakte unu Y-komponenton, kaj ĉiu individua grupo de kvar pikseloj havas ekzakte unu Cb kaj unu Cr-komponenton. Tial, la bildo enhavas kvaroble malpli da kolorinformoj ol la originalo.

La kolorspaco YCbCr ne estas nur uzata en JPEG-oj. Ĝi estis origine inventita en 1938 por televidprogramoj. Ne ĉiuj havas koloran televidilon, do apartigi koloron kaj helecon permesis al ĉiuj ricevi la saman signalon, kaj televidiloj sen koloro nur uzis nur la helecan komponenton.

Tial, forigi unu numeron de la redaktilo tute detruas ĉiujn kolorojn. La komponantoj estas konservitaj en la formo YYYY Cb Cr (fakte, ne nepre en ĉi tiu ordo - la konserva ordo estas specifita en la dosierkapo). Forigi la unuan nombron kaŭzos la unuan valoron de Cb esti perceptita kiel Y, Cr kiel Cb, kaj ĝenerale, domenefiko estos akirita, ŝanĝante ĉiujn kolorojn de la bildo.

La JPEG-specifo ne postulas, ke vi uzu YCbCr. Sed plej multaj dosieroj uzas ĝin ĉar ĝi donas pli bonkvalitajn bildojn post subspecimeno kompare kun RGB. Sed vi ne devas kredi mian vorton. Vidu mem en la suba tabelo, kiel aspektus subspecimena ĉiu individua komponanto en RGB kaj YCbCr.

Kiel funkcias la JPEG-formato
(Interaga versio en originala artikoloj).

La forigo de bluo ne estas tiel rimarkebla kiel ruĝa aŭ verda. Tio estas pro la ses milionoj da konusoj en viaj okuloj, ĉirkaŭ 64% estas sentemaj al ruĝa, 32% al verdo, kaj 2% al bluo.

La subspecimenigo de la Y-komponento (malsupre maldekstre) vidiĝas plej bone. Eĉ malgranda ŝanĝo estas videbla.

Konverti bildon de RGB al YCbCr ne reduktas la grandecon de dosiero, sed ĝi faciligas trovi malpli rimarkindajn detalojn, kiuj povas esti forigitaj. Perda kunpremo okazas en la dua etapo. Ĝi baziĝas sur la ideo prezenti datumojn en pli kunpremebla formo.

2. Diskreta kosinusa transformo kaj diskretigo

Ĉi tiu nivelo de kunpremo, plejparte, difinas la esencon de JPEG. Post konverti la kolorojn al YCbCr, la komponantoj estas kunpremitaj individue, do ni povas nur koncentriĝi pri la Y-komponento de nun. Kaj jen kiel aspektas la bajtoj de la Y-komponento post aplikado de ĉi tiu nivelo.

Kiel funkcias la JPEG-formato
(Interaga versio en originala artikoloj). En la interaga versio, klakante sur pikselo rulumas la redaktilon al la linio kiu reprezentas ĝin. Provu forigi nombrojn de la fino aŭ aldoni kelkajn nulojn al certa nombro.

Unuavide, ĝi aspektas kiel tre malbona kunpremo. Estas 100 000 pikseloj en bildo, kaj necesas 102 400 nombroj por indiki ilian brilecon (Y-komponentoj) - tio estas pli malbona ol tute ne kunpremi ion!

Tamen, notu, ke la plej multaj el ĉi tiuj nombroj estas nul. Krome, ĉiuj ĉi tiuj nuloj ĉe la fino de la linioj povas esti forigitaj sen ŝanĝi la bildon. Restas ĉirkaŭ 26 000 nombroj, tio estas preskaŭ 4 fojojn malpli!

Ĉi tiu nivelo enhavas la sekreton de ŝakpadronoj. Male al aliaj efikoj, kiujn ni vidis, la aspekto de ĉi tiuj ŝablonoj ne estas problemo. Ili estas la konstrubriketoj de la tuta bildo. Ĉiu linio de la redaktilo enhavas ekzakte 64 nombrojn, diskretajn kosinustransformojn (DCT) koeficientojn respondantajn al la intensecoj de 64 unikaj ŝablonoj.

Ĉi tiuj ŝablonoj estas formitaj surbaze de la kosinusintrigo. Jen kiel kelkaj el ili aspektas:

Kiel funkcias la JPEG-formato
8 el 64 probableco

Malsupre estas bildo montranta ĉiujn 64 ŝablonojn.

Kiel funkcias la JPEG-formato
(Interaga versio en originala artikoloj).

Ĉi tiuj ŝablonoj estas de aparta graveco ĉar ili formas la bazon de la 8x8 bildoj. Se vi ne konas linearan algebron, tio signifas, ke ajna 8x8 bildo povas esti akirita de ĉi tiuj 64 ŝablonoj. DCT estas la procezo rompi bildojn en 8x8 blokojn kaj konverti ĉiun blokon en kombinaĵon de ĉi tiuj 64 koeficientoj.

La fakto, ke iu ajn bildo povas esti kunmetita de 64 specifaj ŝablonoj ŝajnas magio. Tamen tio estas la sama kiel diri, ke ajna loko sur la Tero povas esti priskribita per du nombroj - latitudo kaj longitudo [indikante la hemisferojn / ĉ. transl.]. Ni ofte pensas pri la Tera surfaco kiel dudimensia, do ni bezonas nur du nombrojn. Bildo 8x8 havas 64 dimensiojn, do ni bezonas 64 nombrojn.

Ankoraŭ ne estas klare kiel ĉi tio helpas nin rilate kunpremadon. Se ni bezonas 64 nombrojn por reprezenti 8x8 bildon, kial ĉi tio estus pli bona ol nur stoki 64 lumajn komponantojn? Ni faras tion pro la sama kialo, ke ni transformis tri RGB-nombrojn en tri YCbCr-nombrojn: ĝi permesas al ni forigi subtilajn detalojn.

Estas malfacile vidi ĝuste kiaj detaloj estas forigitaj en ĉi tiu etapo ĉar JPEG aplikas DCT al 8x8-blokoj. Tamen neniu malpermesas al ni apliki ĝin al la tuta bildo. Jen kiel aspektas la DCT por la Y-komponento kiam aplikata al la tuta bildo:

Kiel funkcias la JPEG-formato

Pli ol 60 nombroj povas esti forigitaj de la fino kun preskaŭ neniuj rimarkindaj ŝanĝoj en la foto.

Kiel funkcias la JPEG-formato

Rimarku, tamen, ke se ni nuligas la unuajn kvin nombrojn, la diferenco estos evidenta.

Kiel funkcias la JPEG-formato

La nombroj komence reprezentas malaltfrekvencajn ŝanĝojn en la bildo, kaj niaj okuloj kaptas ilin plej bone. Nombroj al la fino indikas altfrekvencajn ŝanĝojn, kiuj estas pli malfacile rimarkeblaj. Por "vidi kion la okulo ne povas vidi" ni povas izoli ĉi tiujn altfrekvencajn detalojn nuligante la unuajn 5000 nombrojn.

Kiel funkcias la JPEG-formato

Ni vidas ĉiujn areojn de la bildo kie la plej granda ŝanĝo okazas de pikselo al pikselo. Elstaras la okuloj de la kato, liaj barboj, la felkovrilo kaj la ombroj en la malsupra maldekstra angulo. Vi povas iri plu nuligante la unuajn 10 nombrojn:

Kiel funkcias la JPEG-formato

20 000:

Kiel funkcias la JPEG-formato

40 000:

Kiel funkcias la JPEG-formato

60 000:

Kiel funkcias la JPEG-formato

Ĉi tiuj altfrekvencaj detaloj estas forigitaj de JPEG dum la kunpremadstadio. Konverti kolorojn al DCT-koeficientoj estas senperda. Perdoj formiĝas ĉe la specimena paŝo, kie valoroj de altfrekvenco aŭ proksimaj al nulo estas forigitaj. Kiam vi malaltigas la kvaliton de JPEG-ŝparado, la programo pliigas la sojlon por la nombro da valoroj por esti forigitaj, kio reduktas la dosiergrandecon, sed faras la bildon pli pikselita. Do la bildo en la unua sekcio, kiu estis 57 fojojn pli malgranda, aspektis tiel. Ĉiu 8x8 bloko reprezentis multe pli malgrandan nombron da DCT-koeficientoj komparite kun la pli altkvalita versio.

Vi povas fari ion tiel mojosa kiel iom post iom flui bildojn. Vi povas montri malklaran bildon, kiu fariĝas pli kaj pli detala dum pli da koeficientoj estas elŝutitaj.

Jen, nur por amuzo, kio okazas kiam oni uzas nur 24 nombrojn:

Kiel funkcias la JPEG-formato

Aŭ nur 5000:

Kiel funkcias la JPEG-formato

Tre malklara sed rekonebla!

3. Kodigo de kurlongoj, delto kaj Huffman

Ĝis nun, ĉiuj stadioj de kunpremado estis perdaj. La lasta etapo, male, iras sen perdo. Ĝi ne forigas informojn, sed signife reduktas la grandecon de dosiero.

Kiel vi povas kunpremi ion sen forĵeti informojn? Imagu kiel ni priskribus simplan nigran 700 x 437 rektangulon.

JPEG uzas 5000 nombrojn por tio, sed multe pli bonaj rezultoj povas esti atingitaj. Ĉu vi povas imagi kodan skemon, kiu priskribas tian bildon en kiel eble plej malmultaj bajtoj?

La minimuma skemo, kiun mi povus elpensi, uzas kvar: tri por la koloro, kaj kvara por kiom da pikseloj havas tiu koloro. La ideo reprezenti ripetajn valorojn en tia kunpremita maniero nomiĝas kurlonga kodigo. Ĝi estas senperda ĉar ni povas reakiri la koditaj datumoj en ĝia originala formo.

La grandeco de JPEG-dosiero kun nigra rektangulo estas multe pli granda ol 4 bajtoj - memoru, ke ĉe la DCT-nivelo, kunpremado estas aplikata al blokoj de 8x8 pikseloj. Tial, minimume, ni bezonas unu DCT-koeficienton por ĉiu 64 pikseloj. Ni bezonas tian ĉar anstataŭ stoki ununuran DCT-koeficienton sekvitan de 63 nuloj, kur-longa kodigado permesas al ni stoki ununuran nombron kaj indiki "ĉiuj aliaj estas nuloj".

Delta kodigado estas tekniko per kiu ĉiu bajto enhavas diferencon de iu valoro prefere ol absoluta valoro. Tial, redaktado de certaj bajtoj ŝanĝas la koloron de ĉiuj aliaj pikseloj. Ekzemple, anstataŭ stoki

12 13 14 14 14 13 13 14

Ni povus komenci per 12 kaj poste simple noti kiom aldoni aŭ subtrahi por akiri la sekvan nombron. Kaj ĉi tiu sekvenco en delta kodado prenas la formon:

12 1 1 0 0 -1 0 1

La konvertitaj datumoj ne estas pli malgrandaj ol la originalaj datumoj, sed estas pli facile kunpremi ĝin. Apliki deltan kodigon antaŭ kurlonga kodado povas multe helpi dum daŭre estas senperda kunpremo.

Delta kodigado estas unu el la malmultaj teknikoj uzataj ekster 8x8 blokoj. De la 64 DCT-koeficientoj, unu estas simple konstanta ondfunkcio (solida koloro). Ĝi reprezentas la mezan brilecon de ĉiu bloko por la lumkomponentoj, aŭ la mezan bluecon por la Cb-komponentoj, ktp. La unua valoro de ĉiu DCT-bloko estas nomita la Dc-valoro, kaj ĉiu Dc-valoro estas delta kodita kun respekto al la antaŭaj. Sekve, ŝanĝi la brilecon de la unua bloko influos ĉiujn blokojn.

La lasta mistero restas: kiel ŝanĝi la unuopan nombron tute ruinigas la tutan bildon? Ĝis nun, kunpremaj niveloj ne havis tiajn ecojn. La respondo kuŝas en la JPEG-kapo. La unuaj 500 bajtoj enhavas metadatenojn pri la bildo - larĝo, alto, ktp., kaj ĝis nun ni ne laboris kun ili.

Sen kaplinio, estas preskaŭ neeble (nu, tre malfacile) malkodi JPEG. Ŝajnos, ke mi provas priskribi al vi bildon, kaj mi komencas elpensi vortojn por transdoni mian impreson. La priskribo verŝajne estos tre konciza, ĉar mi povas elpensi vortojn kun ĝuste la signifo, kiun mi volas transdoni, sed por ĉiuj aliaj ili ne havos sencon.

Sonas stulte, sed ĝuste tio okazas. Ĉiu JPEG-bildo estas kunpremita kun kodoj specifaj por ĝi. La kodvortaro estas konservita en la kaplinio. Ĉi tiu tekniko nomiĝas "Huffman-kodo" kaj la vortaro nomiĝas Huffman-tabelo. En la kaplinio, la tabelo estas markita per du bajtoj - 255 kaj poste 196. Ĉiu kolorkomponento povas havi sian propran tabelon.

Tabelŝanĝoj draste influos ajnan bildon. Bona ekzemplo estas ŝanĝi 15 al 1 sur la 12-a linio.

Kiel funkcias la JPEG-formato

Ĉi tio estas ĉar la tabeloj precizigas kiel individuaj bitoj estas legeblaj. Ĝis nun, ni nur laboris kun binaraj nombroj en dekuma formo. Sed ĉi tio kaŝas al ni la fakton, ke se vi volas konservi la numeron 1 en bajto, tiam ĝi aspektos kiel 00000001, ĉar ĉiu bajto devas havi ekzakte ok bitojn, eĉ se nur unu el ili estas necesa.

Ĉi tio eble estas granda malŝparo de spaco se vi havas multajn malgrandajn nombrojn. Huffman-kodo estas tekniko kiu permesas malstreĉi tiun postulon, ke ĉiu nombro devas okupi ok bitojn. Ĉi tio signifas, ke se vi vidas du bajtojn:

234 115

Tiam, depende de la Huffman-tabelo, ĝi povas esti tri nombroj. Por ĉerpi ilin, vi unue devas dividi ilin en individuajn pecojn:

11101010 01110011

Poste ni turnas nin al la tablo por kompreni kiel grupigi ilin. Ekzemple, ĝi povus esti la unuaj ses bitoj, (111010), aŭ 58 en decimalo, sekvitaj de kvin bitoj (10011), aŭ 19, kaj finfine la lastaj kvar bitoj (0011), aŭ 3.

Tial, estas tre malfacile kompreni la bajtojn en ĉi tiu etapo de kunpremado. La bajtoj ne reprezentas tion, kion ili ŝajnas. Mi ne eniros la detalojn pri laboro kun la tablo en ĉi tiu artikolo, sed materialoj pri ĉi tiu afero interrete estas sufiĉa.

Unu el la bonegaj lertaĵoj, kiujn vi povas fari kun ĉi tiu scio, estas apartigi la kaplinion de la JPEG kaj konservi ĝin aparte. Fakte, rezultas, ke nur vi povas legi la dosieron. Facebook faras tion por plu redukti dosierojn.

Kion alian oni povas fari estas sufiĉe ŝanĝi la tablon de Huffman. Por aliaj, ĝi aspektos kiel fuŝita bildo. Kaj nur vi scios la magian opcion por ripari ĝin.

Resume: kio do necesas por malkodi JPEG? Necesa:

  1. Eltiru la Huffman-tabelon(j)n de la kaplinio kaj malkodi la bitojn.
  2. Eltiru la diskretajn kosinusajn transformkoeficientojn por ĉiu koloro kaj lumeckomponento por ĉiu 8x8 bloko inverse transformante kurlongan kodigon kaj delton.
  3. Kombinu kosinojn bazitajn sur koeficientoj por akiri pikselojn por ĉiu 8x8 bloko.
  4. Skali kolorkomponentojn se subspecimenigo estis farita (ĉi tiu informo estas en la kaplinio).
  5. Konvertu la rezultajn YCbCr-valorojn por ĉiu pikselo al RGB.
  6. Alportu la bildon al la ekrano!

Serioza laboro por simple rigardi foton kun kato! Tamen, kion mi ŝatas pri ĝi estas ke ĝi montras kiel homa-centra JPEG teknologio estas. Ĝi baziĝas sur la trajtoj de nia percepto, kio permesas al ni atingi multe pli bonan kunpremadon ol konvenciaj teknologioj. Kaj nun, komprenante kiel JPEG funkcias, vi povas imagi kiel ĉi tiuj teknologioj povas esti translokigitaj al aliaj areoj. Ekzemple, delta kodigo en video povas rezultigi signifan redukton en dosiergrandeco, ĉar ekzistas ofte tutaj areoj kiuj ne ŝanĝiĝas de kadro al kadro (ekzemple, la fono).

Kodo uzata en la artikolo, estas malfermita kaj enhavas instrukciojn por anstataŭigi la bildojn per viaj propraj.

fonto: www.habr.com

Aldoni komenton