Hur JPEG-formatet fungerar

JPEG-bilder Ă€r överallt i vĂ„ra digitala liv, men bakom denna medvetenhet döljer sig algoritmer som tar bort detaljer som inte uppfattas av det mĂ€nskliga ögat. Resultatet blir en hög visuell kvalitet med minimal filstorlek – men hur fungerar allt detta egentligen? LĂ„t oss se vad vĂ„ra ögon faktiskt inte ser!

Hur JPEG-formatet fungerar

Det Ă€r lĂ€tt att ta för givet möjligheten att skicka en bild till en vĂ€n, utan att oroa sig för vilken enhet, webblĂ€sare eller operativsystem de anvĂ€nder – men sĂ„ har det inte alltid varit. I början av 1980-talet kunde datorer lagra och visa digitala bilder, men det fanns mĂ„nga konkurrerande idĂ©er om det bĂ€sta sĂ€ttet att göra det. Man kunde inte bara skicka en bild frĂ„n en dator till en annan och hoppas att allt skulle fungera.

För att lösa detta problem sammankallades 1986 en kommittĂ© med experter frĂ„n hela vĂ€rlden som kallades "Gemensam kommittĂ© för fotografiska experter" (Joint Photographic Experts Group, JPEG), bildad som ett resultat av ett samarbete mellan Internationella standardiseringsorganisationen (ISO) och Internationella elektrotekniska kommissionen (IEC) – tvĂ„ internationella standardiseringsorganisationer med huvudkontor i GenĂšve (Schweiz).

Gruppen personer som kallas JPEG skapade JPEG-standarden för komprimering av digitala bilder Ă„r 1992. Alla som har anvĂ€nt internet har sannolikt stött pĂ„ bilder i JPEG-kodning. Det Ă€r det mest spridda sĂ€ttet att koda, skicka och lagra bilder. FrĂ„n webbsidor till e-post och sociala medier anvĂ€nds JPEG miljarder gĂ„nger om dagen – varje gĂ„ng vi tittar pĂ„ en bild online eller skickar en. Utan JPEG skulle webben vara mindre livfull, lĂ„ngsammare och förmodligen ha fĂ€rre kattbilder!

Den hÀr artikeln handlar om hur man avkodar en JPEG-bild. Med andra ord, vad som krÀvs för att omvandla komprimerade data som lagras pÄ en dator till en bild som visas pÄ skÀrmen. Det Àr viktigt att veta detta, inte bara för att förstÄ teknologin som vi anvÀnder dagligen, utan ocksÄ för att genom att avslöja komprimeringsnivÄer fÄr vi en bÀttre förstÄelse för perception och syn, liksom vilka detaljer vÄra ögon Àr mest benÀgna att uppfatta.

Dessutom Àr det mycket intressant att experimentera med bilder pÄ detta sÀtt.

Hur JPEG-formatet fungerar

Att kika inuti JPEG

PÄ datorn lagras allt som en sekvens av binÀra siffror. Vanligtvis grupperas dessa bitar, nollor och ettor, i grupper om Ätta, vilket bildar byte. NÀr du öppnar en JPEG-bild pÄ datorn mÄste nÄgot (webblÀsaren, operativsystemet, eller nÄgot annat) avkoda byte och Äterskapa den ursprungliga bilden som en lista med fÀrger som kan visas.

Om du laddar ner detta bedÄrande kattfoto och öppnar det i en textredigerare, kommer du att se en massa osammanhÀngande tecken.

Hur JPEG-formatet fungerar
HÀr anvÀnder jag Notepad++ för att undersöka filens innehÄll, eftersom vanliga textredigerare som Notepad i Windows kommer att förstöra den binÀra filen efter att den har sparats, vilket gör att den slutar att uppfylla JPEG-formatet.

Genom att öppna bilden i en textredigerare förvirrar du datorn pÄ samma sÀtt som du förvirrar din hjÀrna nÀr du gnuggar ögonen och börjar se fÀrgade flÀckar!

Dessa flĂ€ckar som du ser kallas för fosfener, och de Ă€r inte resultatet av ljusstimuli eller hallucinationer som skapas av sinnet. De uppstĂ„r eftersom din hjĂ€rna antar att alla elektriska signaler i synnerverna överför information om ljus. HjĂ€rnan mĂ„ste göra sĂ„dana antaganden eftersom det Ă€r omöjligt att veta om signalen Ă€r ljud, synintryck eller nĂ„got annat. Alla nerver i kroppen överför exakt likadana elektriska impulser. Genom att trycka pĂ„ ögonen skickar du signaler som inte Ă€r visuella men som aktiverar ögats receptorer, vilket din hjĂ€rna tolkar – i det hĂ€r fallet felaktigt – som nĂ„got visuellt. Du Ă€r bokstavligt talat kapabel att se trycket!

Det Ă€r intressant att tĂ€nka pĂ„ hur datorer liknar hjĂ€rnan, men det Ă€r ocksĂ„ en nyttig analogi som belyser hur mycket betydelsen av data – som överförs genom kroppen via nerver eller lagras pĂ„ datorn – beror pĂ„ deras tolkning. All binĂ€r data bestĂ„r av ettor och nollor, de grundlĂ€ggande komponenterna som kan överföra information av alla slag. Din dator gissar ofta hur man ska tolka dem med hjĂ€lp av ledtrĂ„dar, som filĂ€ndelser. Nu fĂ„r vi den att tolka dem som text, eftersom det Ă€r vad textredigeraren förvĂ€ntar sig.

För att förstĂ„ hur man avkodar JPEG, behöver vi se de ursprungliga signalerna – den binĂ€ra datan. Det kan göras med en hex-redigerare, eller direkt pĂ„ webbsidan för originalartikeln! DĂ€r finns en bild, bredvid vilken alla dess byte (utom headern) listas i ett textfĂ€lt, representerade i decimalform. Du kan Ă€ndra dem, och skriptet kodar om och ger en ny bild i realtid.

Hur JPEG-formatet fungerar

Man kan lÀra sig mycket bara genom att experimentera med den hÀr redigeraren. Till exempel, kan du sÀga i vilken ordning pixlarna lagras?

Det konstiga med det hÀr exemplet Àr att förÀndringar av vissa siffror överhuvudtaget inte pÄverkar bilden, men om du till exempel ersÀtter nummer 17 med 0 i den första raden, sÄ förstörs bilden helt!

Hur JPEG-formatet fungerar

Andra förÀndringar, till exempel att byta 7 pÄ rad 1988 till siffran 254, Àndrar fÀrgen, men bara för de efterföljande pixlarna.

Hur JPEG-formatet fungerar

Det kanske mest mĂ€rkliga Ă€r att vissa siffror Ă€ndrar inte bara fĂ€rg, utan Ă€ven formen pĂ„ bilden. Ändra 70 i rad 12 till 2 och kolla pĂ„ den översta raden av bilden för att se vad jag menar.

Hur JPEG-formatet fungerar

Och oavsett vilken JPEG-bild du anvÀnder, kommer du alltid att hitta dessa mystiska schackmönster nÀr du redigerar byten.

Det Àr svÄrt att förstÄ hur bilden Äterskapas frÄn dessa byten nÀr man leker med redigeraren, eftersom JPEG-komprimering bestÄr av tre olika teknologier som tillÀmpas sekventiellt i nivÄer. Vi kommer att studera var och en av dem separat för att avslöja det mystiska beteendet vi observerar.

Tre nivÄer av JPEG-komprimering:

  1. FĂ€rgsublimering.
  2. Diskret cosinustransform och diskretisering.
  3. LÄnga serien kodning, delta och Huffman

För att ge en uppfattning om kompressionens omfattning, observera att bilden ovan representerar 79 819 siffror, vilket motsvarar cirka 79 kB. Om vi hade lagrat den utan kompression skulle varje pixel krÀva tre siffror - för den röda, gröna och blÄ komponenten. Detta skulle bli 917 700 siffror, eller cirka 917 kB. Tack vare JPEG-kompressionen minskade den slutliga filen med mer Àn 10 gÄnger!

I sjĂ€lva verket kan den hĂ€r bilden komprimeras mycket mer. Nedan visas tvĂ„ bilder bredvid varandra – fotot till höger har komprimerats till 16 kB, vilket Ă€r 57 gĂ„nger mindre Ă€n den okomprimerade versionen!

Hur JPEG-formatet fungerar

Om man ser noga kommer man att mÀrka att dessa bilder inte Àr identiska. BÄda Àr bilder med JPEG-kompression, men den högra Àr mycket mindre i storlek. Den ser ocksÄ lite sÀmre ut (titta pÄ fÀrgkvadraterna i bakgrunden). DÀrför kallas JPEG Àven för förlustkompression; under kompressionsprocessen förÀndras bilden och förlorar vissa detaljer.

1. FĂ€rgsublimering

HÀr Àr bilden med endast första nivÄn av kompression tillÀmpad.

Hur JPEG-formatet fungerar
(Interaktiv version – i originalet artikeln). Att ta bort ett nummer förstör alla fĂ€rger. Men om exakt sex siffror tas bort pĂ„verkar det bilden nĂ€mnvĂ€rt lite.

Nu Àr siffrorna nÄgot enklare att avkoda. Det Àr nÀstan en enkel fÀrglista, dÀr varje byte Àndrar exakt en pixel, men den Àr redan dubbelt sÄ liten som den okomprimerade bilden (som skulle ta cirka 300 kB i denna minskade storlek). Kan du gissa varför?

Man kan se att dessa siffror inte representerar de standard röda, gröna och blÄ komponenterna, eftersom om man ersÀtter alla siffror med nollor fÄr vi en grön bild (och inte en vit).

Hur JPEG-formatet fungerar

Det beror pÄ att dessa byte representerar Y (ljusstyrka),

Hur JPEG-formatet fungerar

Cb (relativ grönhet),

Hur JPEG-formatet fungerar

och Cr (relativ rödhet) i bilden.

Hur JPEG-formatet fungerar

Varför inte anvĂ€nda RGB? Eftersom det Ă€r sĂ„ de flesta moderna skĂ€rmar fungerar. Din monitor kan visa vilken fĂ€rg som helst, inklusive röd, grön och blĂ„ med olika intensiteter för varje pixel. Vitt uppstĂ„r genom att aktivera alla tre pĂ„ full ljusstyrka, och svart – genom att stĂ€nga av dem.

Hur JPEG-formatet fungerar

Detta liknar ocksĂ„ hur det mĂ€nskliga ögat fungerar. FĂ€rgreceptorerna i vĂ„ra ögon kallas "tappar« och delas upp i tre typer, dĂ€r var och en Ă€r mer kĂ€nslig för antingen röd, grön eller blĂ„ fĂ€rg [S-typ koner Ă€r kĂ€nsliga för violett-blĂ„tt (S frĂ„n engelska Short – kortvĂ„gigt spektrum), M-typ – för grön-gult (M frĂ„n engelska Medium – medellĂ„ngvĂ„gigt), och L-typ – för gul-rött (L frĂ„n engelska Long – lĂ„ngvĂ„gigt) delar av spektrumet. NĂ€rvaron av dessa tre typer av koner (och stavar, som Ă€r kĂ€nsliga för smaragdgrön del av spektrumet) ger mĂ€nniskan fĂ€rgseende. / anteckning översĂ€ttare]. Stavar, en annan typ av fotoreceptorer i vĂ„ra ögon, kan upptĂ€cka förĂ€ndringar i ljusstyrka, men Ă€r mycket mer kĂ€nslig för fĂ€rg. VĂ„ra ögon har cirka 120 miljoner stavar och endast 6 miljoner koner.

DÀrför Àr vÄra ögon mycket bÀttre pÄ att lÀgga mÀrke till förÀndringar i ljusstyrka Àn förÀndringar i fÀrg. Om man separerar fÀrg frÄn ljusstyrka kan man ta bort en del av fÀrgen och ingen mÀrker nÄgot. FÀrgsubdiskretisering Àr processen att representera fÀrgkomponenterna i en bild med lÀgre upplösning jÀmfört med ljusstyrkomponenterna. I exemplet ovan har varje pixel precis en komponent Y, och varje sÀrskild grupp av fyra pixlar har exakt en komponent Cb och en Cr. DÀrför innehÄller bilden fyra gÄnger mindre fÀrginformation Àn originalet.

FÀrgrymden YCbCr anvÀnds inte bara i JPEG. Den uppfanns ursprungligen 1938 för tv-sÀndningar. Inte alla hade fÀrg-tv, sÄ separeringen av fÀrg och ljusstyrka gjorde det möjligt för alla att ta emot samma signal, medan fÀrglösa tv-apparater bara anvÀnde ljusstyrkekomponenten.

DĂ€rför förstör eliminering av ett tal i redigeraren helt alla fĂ€rger. Komponenterna lagras som Y Y Y Y Cb Cr (faktiskt Ă€r det inte nödvĂ€ndigtvis i den ordningen – lagringsordningen definieras i filens header). Att ta bort det första talet kommer att fĂ„ den första Cb-vĂ€rdet att uppfattas som Y, Cr som Cb, och det ger totalt ett dominoeffekt som vĂ€xlar alla fĂ€rger i bilden.

JPEG-specifikationen tvingar inte dig att anvÀnda YCbCr. Men i de flesta filer anvÀnds den eftersom den ger bilder av bÀttre kvalitet efter undersampling jÀmfört med RGB. Men du behöver inte tro pÄ mig. Titta sjÀlv pÄ tabellen nedan, hur undersamplingen av varje enskild komponent ser ut i bÄde RGB och YCbCr.

Hur JPEG-formatet fungerar
(Interaktiv version – i originalet artiklar).

Att ta bort blÄtt Àr inte lika mÀrkbart som rött eller grönt. Det beror pÄ att av de sex miljoner tapparna i dina ögon Àr ungefÀr 64% kÀnsliga för rött, 32% för grönt och 2% för blÄtt.

Undersamplingen av Y-komponenten (lĂ€ngst ner till vĂ€nster) Ă€r mest synlig. Även en liten förĂ€ndring Ă€r mĂ€rkbar.

Att konvertera en bild frÄn RGB till YCbCr minskar inte filstorleken, men underlÀttar att hitta mindre mÀrkbara detaljer som kan tas bort. Förlustkomprimering sker i det andra steget. Det bygger pÄ idén att representera data pÄ ett mer komprimerbart sÀtt.

2. Diskret cosinustransform och undersampling

Denna kompressionsnivÄ definierar till stor del essensen av JPEG. Efter fÀrgkonvertering till YCbCr komprimeras komponenterna separat, sÄ vi kan fokusera pÄ Y-komponenten. Och sÄ hÀr ser byten av Y-komponenten ut efter denna nivÄ.

Hur JPEG-formatet fungerar
(Interaktiv version – i originalet artiklar). I den interaktiva versionen klickar du pĂ„ en pixel för att scrolla till den rad som representerar den. Testa att ta bort siffror frĂ„n slutet eller lĂ€gga till nĂ„gra nollor till ett specifikt nummer.

Vid första anblick ser det ut som en mycket dĂ„lig komprimering. I bilden finns 100 000 pixlar, och för att ange deras ljusstyrka (Y-komponenter) behövs 102 400 siffror — det Ă€r sĂ€mre Ă€n om ingenting komprimeras!

Men notera att de flesta av dessa siffror Àr nollor. Dessutom kan alla dessa nollor i slutet av rader tas bort utan att Àndra bilden. UngefÀr 26 000 siffror ÄterstÄr, och det Àr nÀstan fyra gÄnger mindre!

PÄ denna nivÄ finns hemligheten bakom schackmönstren. Till skillnad frÄn andra effekter vi har sett, Àr uppkomsten av dessa mönster inte en bugg. De Àr byggstenar i hela bilden. Varje rad i editorn innehÄller exakt 64 siffror, koefficienter för den diskreta cosinustransformen (DCT), som motsvarar intensiteterna av 64 unika mönster.

Dessa mönster bildas baserat pÄ kosinusgrafen. SÄ hÀr ser nÄgra av dem ut:

Hur JPEG-formatet fungerar
8 av 64 koefficienter

Nedan finns en bild som visar alla 64 mönster.

Hur JPEG-formatet fungerar
(Interaktiv version – i originalet artiklar).

Dessa mönster har en sÀrskild betydelse eftersom de bildar basen för bilder av storlek 8x8. Om du inte Àr bekant med linjÀr algebra, betyder det att vilken bild som helst av storlek 8x8 kan skapas frÄn dessa 64 mönster. DCT Àr processen för att dela upp bilder i block av 8x8 och omvandla varje block till en kombination av dessa 64 koefficienter.

Att vilken bild som helst kan sammanstĂ€llas av 64 specifika mönster verkar magiskt. Men det Ă€r samma sak som att sĂ€ga att vilken plats som helst pĂ„ jorden kan beskrivas med tvĂ„ siffror – latitud och longitud [med hĂ€nvisning till hemisfĂ€rer / anm. frĂ„n övers.]. Vi betraktar ofta jordens yta som tvĂ„dimensionell, sĂ„ vi behöver bara tvĂ„ siffror. En 8x8-bild har 64 dimensioner, sĂ„ vi behöver 64 siffror.

Det Àr fortfarande oklart hur detta hjÀlper oss nÀr det gÀller komprimering. Om vi behöver 64 siffror för att representera en 8x8-bild, varför skulle denna metod vara bÀttre Àn att bara lagra 64 ljusstyrkekomponenter? Vi gör detta av samma anledning som vi omvandlade tre RGB-siffror till tre YCbCr-siffror: det gör det möjligt för oss att ta bort osynliga detaljer.

Det Àr svÄrt att se vilka detaljer som tas bort i detta skede eftersom JPEG tillÀmpar DCT pÄ 8x8-block. Men ingen hindrar oss frÄn att tillÀmpa det pÄ hela bilden. SÄ hÀr ser DCT ut för Y-komponenten nÀr den tillÀmpas pÄ hela bilden:

Hur JPEG-formatet fungerar

FrÄn slutet kan man ta bort mer Àn 60 000 siffror praktiskt taget utan mÀrkbara förÀndringar pÄ fotot.

Hur JPEG-formatet fungerar

Men observera att om vi nollstÀller de första fem siffrorna, kommer skillnaden att vara uppenbar.

Hur JPEG-formatet fungerar

Siffrorna i början representerar förÀndringar av lÄg frekvens i bilden, och vÄra ögon uppfattar dem bÀst. Siffrorna nÀrmare slutet representerar förÀndringar av hög frekvens, som Àr svÄrare att upptÀcka. För att "se det som inte syns för ögat" kan vi isolera dessa högfrekventa detaljer genom att nollstÀlla de första 5000 siffrorna.

Hur JPEG-formatet fungerar

Vi ser alla omrÄden av bilden dÀr den största förÀndringen sker frÄn pixel till pixel. Kattens ögon, dess morrhÄr, det fluffiga tÀcket och skuggorna i det nedre vÀnstra hörnet framhÀvs. Man kan gÄ Ànnu lÀngre och nollstÀlla de första 10 000 siffrorna:

Hur JPEG-formatet fungerar

20 000:

Hur JPEG-formatet fungerar

40 000:

Hur JPEG-formatet fungerar

60 000:

Hur JPEG-formatet fungerar

Dessa högfrekventa detaljer tas bort i JPEG-komprimeringssteget. FÀrgkonvertering till DCT-koefficienter Àr förlustfri. Förluster uppstÄr vid diskretiseringen dÀr höga frekvenser eller vÀrden nÀra noll tas bort. NÀr du sÀnker JPEG-sparandets kvalitet ökar programmet tröskelvÀrdet för antalet borttagna vÀrden, vilket ger en minskning av filstorleken men gör bilden mer pixelerad. DÀrför sÄg bilden i första avsnittet, som var 57 gÄnger mindre, ut pÄ det hÀr sÀttet. Varje 8x8-block representerades av ett betydligt mindre antal DCT-koefficienter jÀmfört med en högre kvalitetsversion.

Du kan skapa en hÀftig effekt som en gradvis strömmande bild. Du kan visa en suddig bild som blir mer och mer detaljerad nÀr fler koefficienter laddas ner.

HÀr, bara av nyfikenhet, vad som skulle hÀnda om vi anvÀnde bara 24 000 siffror:

Hur JPEG-formatet fungerar

Eller bara 5000:

Hur JPEG-formatet fungerar

Mycket suddigt, men ÀndÄ kÀnns det igen!

3. LĂ€ngdkodning, delta och Huffman

Hittills har alla komprimeringssteg varit med förlust. Det sista steget Àr dÀremot utan förlust. Det tar inte bort information, men minskar avsevÀrt filstorleken.

Hur kan man komprimera nÄgot utan att förlora information? TÀnk pÄ hur vi skulle beskriva en enkel svart rektangel 700 x 437.

JPEG anvÀnder 5000 siffror för detta, men man kan uppnÄ mycket bÀttre resultat. Kan du förestÀlla dig ett kodningsschema som skulle beskriva en sÄdan bild med sÄ fÄ byte som möjligt?

Det minimi-schema jag kunde komma pÄ anvÀnder fyra: tre för att ange fÀrgen och den fjÀrde - hur mÄnga pixlar som har den fÀrgen. Idén att representera upprepade vÀrden pÄ detta komprimerade sÀtt kallas lÀngdkodning. Det Àr utan förlust, eftersom vi kan ÄterstÀlla de kodade uppgifterna i sitt ursprungliga tillstÄnd.

Filstorleken för JPEG med en svart rektangel Ă€r mycket större Ă€n 4 byte – kom ihĂ„g att pĂ„ DCT-nivĂ„ tillĂ€mpas komprimering pĂ„ block av 8x8 pixlar. SĂ„ vi behöver minst en DCT-koefficient för varje 64 pixlar. En behövs eftersom kodning av lĂ„nga serier gör att vi kan lagra ett enda tal och ange att "alla andra Ă€r nollor".

Delta-kodning Àr en teknik dÀr varje byte innehÄller skillnaden frÄn ett visst vÀrde, snarare Àn det absoluta vÀrdet. DÀrför Àndrar redigering av vissa bytes fÀrgen pÄ alla andra pixlar. Till exempel, istÀllet för att lagra

12 13 14 14 14 13 13 14

Vi skulle kunna börja med 12 och sedan helt enkelt ange hur mycket som ska lÀggas till eller dras ifrÄn för att fÄ nÀsta nummer. Och denna sekvens i delta-kodning fÄr följande utseende:

12 1 1 0 0 -1 0 1

De transformerade data blir inte mindre Àn originalet, men det Àr lÀttare att komprimera dem. AnvÀndning av delta-kodning före kodning av lÄnga serier kan hjÀlpa mycket, samtidigt som det ÀndÄ Àr förlustfri komprimering.

Delta-kodning Àr en av de fÄ tekniker som tillÀmpas utanför 8x8-block. Av 64 DCT-koefficienter Àr en enkel en konstant vÄgfunktion (en solid fÀrg). Den representerar den genomsnittliga ljusstyrkan för varje block för ljusstyrkekomponenter, eller den genomsnittliga blÄ nyansen för Cb-komponenter och sÄ vidare. Det första vÀrdet i varje DCT-block kallas DC-vÀrde, och varje DC-vÀrde genomgÄr delta-kodning i förhÄllande till de föregÄende. DÀrför pÄverkar en förÀndring av ljusstyrkan i det första blocket alla block.

Det resterande sista mysteri Ă€r: hur kan förĂ€ndringen av ett enda tal helt förstöra hela bilden? SĂ„dana egenskaper har inte funnits i komprimeringsnivĂ„er hittills. Svaret ligger i JPEG-huvudet. De första 500 byten innehĂ„ller metadata om bilden – bredd, höjd, och sĂ„ vidare, och sĂ„ lĂ€nge vi inte har arbetat med dem.

Utan huvudet Àr det praktiskt taget omöjligt (eller vÀldigt svÄrt) att dekoda JPEG. Det skulle se ut som om jag försöker beskriva en mÄlning för dig och börjar hitta pÄ ord för att uttrycka min uppfattning. Beskrivningen blir sannolikt ganska komprimerad, eftersom jag kan hitta pÄ ord med just den betydelsen som jag vill förmedla, men för alla andra kommer de att sakna mening.

Det lĂ„ter dumt, men sĂ„ hĂ€r gĂ„r det till. Varje JPEG-bild komprimeras med koder som Ă€r specifika för just den. Kodordboken lagras i rubriken. Denna teknik kallas "Huffman-kodning", och ordboken Ă€r en Huffman-tabell. I rubriken markeras tabellen med tvĂ„ byte – 255 och sedan 196. Varje fĂ€rgkomponent kan ha sin egen tabell.

Ändringarna av tabellerna kommer radikalt pĂ„verka vilken bild som helst. Ett bra exempel Ă€r att byta ut 1 mot 12 pĂ„ rad 15.

Hur JPEG-formatet fungerar

Detta sker eftersom tabellerna anger hur man ska lÀsa enskilda bitar. Hittills har vi bara arbetat med binÀra tal i decimal form. Men detta döljer för oss det faktum att om du vill lagra talet 1 i ett byte, sÄ kommer det att se ut som 00000001, eftersom varje byte mÄste ha exakt Ätta bitar, Àven om endast en av dem behövs.

Potentiellt sett Àr detta en stor slöseri med utrymme, om du har mÄnga smÄ tal. Huffman-kodning Àr en teknik som gör det möjligt för oss att lÀtta pÄ kravet om att varje tal mÄste ta Ätta bitar. Det betyder att om du ser tvÄ byte:

234 115

Beroende pÄ Huffman-tabellen kan dessa vara tre tal. För att extrahera dem mÄste du först dela upp dem i enskilda bitar:

11101010 01110011

DÀrefter hÀnvisar vi till tabellen för att förstÄ hur de ska grupperas. Till exempel kan detta vara de första sex bitarna (111010), eller 58 i decimalsystemet, följt av fem bitar (10011), eller 19, och slutligen de sista fyra bitarna (0011), eller 3.

DÀrför Àr det mycket svÄrt att förstÄ byte vid detta komprimeringsstadium. Byte representerar inte det som verkar vara. Jag kommer inte att gÄ in pÄ detaljerna om hur tabellen fungerar i denna artikel, men material. om denna frÄga pÄ nÀtet Àr tillrÀcklig.

Ett av de intressanta trick som man kan göra, nÀr man vet detta, Àr att separera rubriken frÄn JPEG och lagra den separat. I praktiken kommer du att kunna lÀsa filen endast sjÀlv. Facebook gör detta för att ytterligare minska filerna.

Vad mer kan göras – att förĂ€ndra Huffman-tabellen bara lite. För andra kommer det att se ut som en förstörd bild. Och bara du kommer att veta den magiska lösningen för att rĂ€tta till den.

Sammanfattningsvis: vad behövs för att avkoda JPEG? Det krÀvs:

  1. Att extrahera Huffman-tabellen(r) frÄn rubriken och avkoda bitarna.
  2. Extrahera koefficienterna för diskret cosinustransform för varje fÀrg- och ljusstyrkekomponent för varje 8x8-block genom att utföra omvÀnda regler för runlength-kodning och delta.
  3. Kombinera cosinuser baserat pÄ koefficienterna för att fÄ pixelvÀrden för varje 8x8-block.
  4. Skala fÀrgkomponenterna om subsampling har utförts (denna information finns i headern).
  5. Konvertera de erhÄllna YCbCr-vÀrdena för varje pixel till RGB.
  6. Visa bilden pÄ skÀrmen!

Det Àr ett seriöst arbete för att bara visa en bild pÄ en katt! Men det jag gillar med detta Àr att man ser hur mÀnniskocentrerad JPEG-teknologin Àr. Den bygger pÄ vÄra perceptionsspecifikationer, vilket möjliggör mycket bÀttre kompression Àn vanliga teknologier. Och nu, nÀr man förstÄr hur JPEG fungerar, kan man tÀnka sig hur dessa teknologier kan överföras till andra omrÄden. Till exempel kan delta-kodning i video ge ett betydande filstorleksminskning, eftersom det ofta finns hela omrÄden som inte förÀndras frÄn bildruta till bildruta (till exempel bakgrunden).

Koden som anvÀndes i artikeln, Àr öppen och innehÄller instruktioner för att byta ut bilder mot dina egna.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster