Як уладкованы фармат JPEG

Выявы фармату JPEG сустракаюцца паўсюль у нашым лічбавым жыцці, але за гэтым полагам дасведчанасці хаваюцца алгарытмы, якія ліквідуюць дэталі, не ўспрыманыя чалавечым вокам. У выніку атрымліваецца высокая візуальная якасць пры мінімальным памеры файла – але як менавіта ўсё гэта працуе? Давайце паглядзім, чаго менавіта не бачаць нашыя вочы!

Як уладкованы фармат JPEG

Лёгка прыняць, як само сабой якое разумеецца, магчымасць адправіць фотку сябру, і не хвалявацца з нагоды таго, якая прылада, браўзэр ці аперацыйную сістэму ён выкарыстае – аднак так было не заўсёды. Да пачатку 1980-х кампутары ўмелі захоўваць і паказваць лічбавыя выявы, аднак з нагоды найлепшага спосабу для гэтага існавала мноства канкуруючых ідэй. Нельга было проста адправіць выяву з аднаго кампутара на іншы і спадзявацца, што ўсё запрацуе.

Для вырашэння гэтай праблемы ў 1986 годзе быў сабраны камітэт экспертаў з усяго свету пад назвай.Аб'яднаная група экспертаў па фатаграфіі» (Joint Photographic Experts Group, JPEG), заснаваны ў рамках сумеснай працы Міжнароднай арганізацыі па стандартызацыі (ISO) і Міжнароднай электратэхнічнай камісіі (IEC) – дзвюх міжнародных арганізацый па стандартызацыі, штаб-кватэра якіх размешчана ў Жэневе (Швейцарыя).

Група людзей пад назовам JPEG стварыла стандарт сціску лічбавых малюнкаў JPEG у 1992 году. Любы чалавек, які выкарыстоўваў інтэрнэт, верагодна, сустракаўся з выявамі ў кадоўцы JPEG. Гэта самы распаўсюджаны спосаб кадавання, адпраўкі і захоўвання малюнкаў. Ад вэб-старонак да емейла і сацсетак, JPEG выкарыстоўваецца мільярды раз у дзень - практычна кожны раз, калі мы глядзім малюнак анлайн або адпраўляем яго. Без JPEG вэб быў бы менш яркім, больш павольным, і, верагодна, у ім было б менш фотак коцікаў!

Гэты артыкул - аб тым, як дэкадаваць JPEG малюнак. Інакш кажучы, аб тым, што патрабуецца для пераўтварэння сціснутых дадзеных, якія захоўваюцца на кампутары, у малюнак, якое з'яўляецца на экране. Пра гэта варта ведаць не толькі таму, што гэта важна для разумення тэхналогіі, якую мы выкарыстоўваем штодня, але і таму, што раскрываючы ўзроўні сціску, мы лепш даведваемся ўспрыманне і зрок, а таксама тое, да якіх дэталяў нашы вочы успрымальныя за ўсё.

Акрамя таго, гуляцца з выявамі такім спосабам вельмі цікава.

Як уладкованы фармат JPEG

Зазіраючы ўнутр JPEG

На кампутары ўсё захоўваецца ў выглядзе паслядоўнасці двайковых лікаў. Звычайна гэтыя біты, нулі і адзінкі, групуюцца па восем, складаючы байты. Калі вы адкрываеце JPEG малюнак на кампутары, нешта (браўзэр, аперацыёнка, яшчэ нешта) павінна дэкадаваць байты, аднавіўшы першапачатковы малюнак у выглядзе спісу кветак, якія можна паказаць.

Калі вы спампуеце гэтую замілаваную фатаграфію ката і адкрыеце яе ў тэкставым рэдактары, вы ўбачыце кучу няскладных знакаў.

Як уладкованы фармат JPEG
Тут я выкарыстоўваю Notepad++ для вывучэння змесціва файла, паколькі звычайныя тэкставыя рэдактары, тыпу Notepad з Windows, сапсуюць двайковы файл пасля захавання, і ён перастане задавальняць фармату JPEG.

Адкрываючы малюнак у тэкставым рэдактары, вы збіваеце кампутар з панталыку, сапраўды гэтак жа, як вы збіваеце з панталыку свой мозг, калі пацярэце вочы і пачынаеце бачыць каляровыя плямы!

Гэтыя плямы, якія вы бачыце, вядомыя, як фасфены, і не з'яўляюцца вынікам уздзеяння светлавога стымулу або галюцынацыямі, спароджанымі розумам. Яны ўзнікаюць, таму што ваш мозг лічыць, што любыя электрычныя сігналы ў вочных нервах перадаюць інфармацыю аб святле. Мозгу неабходна рабіць такія здагадкі, паколькі ніяк нельга пазнаць, ці з'яўляецца сігнал гукам, бачаннем ці чымсьці яшчэ. Усе нервы ў целе перадаюць абсалютна аднолькавыя электрычныя імпульсы. Душачы на ​​вочы, вы адпраўляеце сігналы, не якія з'яўляюцца глядзельнымі, але якія актывуюць рэцэптары вока, што ваш мозг інтэрпрэтуе – у дадзеным выпадку, няслушна – як нешта глядзельнае. Вы літаральна здольныя бачыць ціск!

Пацешна думаць аб тым, наколькі кампутары падобныя на мозг, аднак гэта таксама з'яўляецца карыснай аналогіяй, якая ілюструе, наколькі моцна значэнне дадзеных - перадаюцца па целе нервамі, або якія захоўваюцца на кампутары - залежыць ад іх інтэрпрэтацыі. Усе двайковыя дадзеныя складаюцца з нулёў і адзінак, базавых кампанентаў, здольных перадаваць інфармацыю любога віду. Ваш кампутар часта здагадваецца, як інтэрпрэтаваць іх пры дапамозе падказак, напрыклад, пашырэнняў файлаў. А зараз мы прымушаем яго інтэрпрэтаваць іх як тэкст, бо менавіта гэтага чакае тэкставы рэдактар.

Каб зразумець, як дэкадаваць JPEG, нам трэба ўбачыць самі першапачатковыя сігналы - двайковыя дадзеныя. Гэта можна зрабіць пры дапамозе шаснаццатковага рэдактара, ці прама на вэб-старонцы арыгінала артыкула! Там ёсць малюнак, побач з якім у тэкставым полі прыведзены ўсе яго байты (акрамя загалоўка), прадстаўленыя ў дзесятковым выглядзе. Вы можаце мяняць іх, і скрыпт перакадуе і выдасць новы малюнак на лета.

Як уладкованы фармат JPEG

Можна даведацца шмат, проста гуляючы з гэтым рэдактарам. Напрыклад, ці можаце вы сказаць, у якім парадку захоўваюцца пікселі?

У гэтым прыкладзе дзіўна тое, што змена некаторых лікаў увогуле не ўплывае на малюнак, а, напрыклад, калі замяніць лік 17 на 0 у першым радку, то фотка цалкам сапсуецца!

Як уладкованы фармат JPEG

Іншыя змены, напрыклад, замена 7 на радку 1988 на лік 254 змяняе колер, але толькі наступных пікселяў.

Як уладкованы фармат JPEG

Магчыма, найбольш дзіўным будзе тое, што некаторыя лікі мяняюць не толькі колер, але і форму малюнка. Зменіце 70 у радку 12 на 2 і паглядзіце не верхні шэраг выявы, каб убачыць, што я маю на ўвазе.

Як уладкованы фармат JPEG

І па-за залежнасцю ад таго, якое JPEG выява вы выкарыстоўваеце, вы заўсёды будзеце знаходзіць гэтыя загадкавыя шахматныя паслядоўнасці пры рэдагаванні байтаў.

Гуляючыся з рэдактарам, цяжка зразумець, як узнаўляецца фотка з гэтых байтаў, паколькі JPEG сціск складаецца з трох розных тэхналогій, якія ўжываюцца паслядоўна па ўзроўнях. Мы вывучым кожную з іх асобна, каб расчыніць назіранае намі загадкавыя паводзіны.

Тры ўзроўню JPEG сціску:

  1. Каляровая субдыскрэтызацыя.
  2. Дыскрэтнае косінуснае пераўтварэнне і дыскрэтызацыя.
  3. Кадаваньне даўжынь сэрый, дэльта и Хафмана

Каб вы маглі ўявіць сабе маштабы сціску, звернеце ўвагу, што малюнак, прыведзены вышэй, уяўляе 79 лікаў, гэта значыць, каля 819 Кб. Калі б мы захоўвалі яго без сціску, для кожнага пікселя запатрабавалася б па тры лікі - для чырвонай, зялёнай і сіняй складніку. Гэта склала б 79 лікаў, або ок. 917 Кб. У выніку JPEG сціску выніковы файл паменшыўся больш за ў 700 раз!

Насамрэч, гэты малюнак можна сціснуць значна мацней. Знізу прыведзены два выявы побач – фотка справа была ўціснутая да 16 Кб, гэта значыць у 57 разоў менш, чым несціснутая версія!

Як уладкованы фармат JPEG

Калі прыгледзецца, будзе відаць, што гэтыя выявы не ідэнтычныя. Абодва яны - карцінкі з JPEG сціскам, аднак правая значна менш па аб'ёме. Таксама яна выглядае крыху горай (паглядзіце на квадраты кветак фону). Таму JPEG яшчэ завуць сціскам са стратамі; падчас сціску малюнак змяняецца і губляе некаторыя дэталі.

1. Каляровая субдыскрэтызацыя

Вось малюнак з ужываннем толькі першага ўзроўню сціску.

Як уладкованы фармат JPEG
(Інтэрактыўная версія - у арыгінал артыкулы). Выдаленне аднаго ліку разбурае ўсе колеры. Аднак калі выдаліць роўна шэсць лікаў, гэта практычна не ўплывае на выяву.

Цяпер лікі крыху прасцей расшыфраваць. Гэта амаль што просты спіс колераў, у якога кожны байт змяняе роўна адзін піксель, але пры гэтым ён ужо ў два разы менш несціснутага малюнка (якое займала б каля 300 Кб у такім паменшаным памеры). Здагадаецеся, чаму?

Можна бачыць, што гэтыя лікі не абазначаюць стандартныя чырвоную, зялёную і сінюю кампаненты, паколькі калі замяніць усе лікі нулямі, мы атрымаем зялёны малюнак (а не белы).

Як уладкованы фармат JPEG

Гэта таму, што гэтыя байты абазначаюць Y (яркасць),

Як уладкованы фармат JPEG

Cb (адносная блакітнасць),

Як уладкованы фармат JPEG

і Cr (адносная чырвань) карцінкі.

Як уладкованы фармат JPEG

Чаму не выкарыстоўваць RGB? Бо менавіта так працуе большасць сучасных экранаў. Ваш манітор можа дэманстраваць любы колер, у тым ліку чырвоны, зялёны і сіні колеры з рознай інтэнсіўнасцю для кожнага пікселя. Белы атрымліваецца уключэннем усіх трох на поўную яркасць, а чорны - іх адключэннем.

Як уладкованы фармат JPEG

Гэта таксама вельмі падобна на працу чалавечага вока. Каляровыя рэцэптары нашых вачэйколбачкі«, І дзеляцца на тры тыпу, кожны з якіх больш адчувальны або да чырвонага, або да зялёнага, або да сіняга колераў [колбачкі S-тыпу адчувальныя ў фіялетава-сіняй (S ад англ. Short - караткахвалевы спектр), M-тыпу - у зялёна-жоўтай (M ад англ. Medium - сярэднехвалевы), і L-тыпу - у жоўта-чырвонай (L ад англ. Long - даўгахвалевы) частках спектру. Наяўнасць гэтых трох відаў колбачак (і палачак, адчувальных у смарагдава-зялёнай частцы спектру) дае чалавеку каляровы зрок. / заўв. перав.]. Палачкі, Іншы тып фотарэцэптараў у нашых вачах, здольны ўлоўліваць змены ў яркасці, аднак значна больш адчувальны да колеру. У нашых вачах ёсць каля 120 млн палачак і ўсяго 6 млн колбачак.

Таму нашы вочы значна лепш заўважаюць змены ў яркасці, чым змены ў колеры. Калі аддзяліць колер ад яркасці, можна прыбраць крыху колеру, і ніхто нічога не заўважыць. Каляровая субдыскрэтызацыя - гэта працэс прадстаўлення каляровых кампанентаў малюнка ў меншым дазволе ў параўнанні з кампанентамі яркасці. У прыкладзе вышэй у кожнага пікселя роўна адзін кампанент Y, а ў кожнай асобнай групы з чатырох пікселяў ёсць роўна адна кампанента Cb і адна Cr. Таму выява змяшчае ў чатыры разы менш каляровай інфармацыі, чым было ў арыгінала.

Каляровая прастора YCbCr выкарыстоўваецца не толькі ў JPEG. Яго першапачаткова прыдумалі ў 1938 годзе для тэлеперадач. Не ва ўсіх ёсць каляровы тэлевізар, таму падзел колеру і яркасці дазволіла ўсім атрымліваць адзін і той жа сігнал, а тэлевізары без колеру проста выкарыстоўвалі толькі кампанент яркасці.

Таму выдаленне аднаго ліку з рэдактара цалкам разбурае ўсе колеры. Кампаненты захоўваюцца ў выглядзе YYYY Cb Cr (насамрэч, не абавязкова ў такім парадку - парадак захоўвання задаецца ў загалоўку файла). Выдаленне першага ліку прывядзе да таго, што першае значэнне Cb будзе ўспрынята, як Y, Cr як Cb, і ў цэлым атрымаецца эфект даміно, які пераключае ўсе колеры карцінкі.

Спецыфікацыя JPEG не абавязвае выкарыстоўваць YCbCr. Але ў большасці файлаў яна выкарыстоўваюцца, паколькі яна дае выявы лепшай якасці пасля субдыскрэтызацыі ў параўнанні з RGB. Але вам не абавязкова верыць мне на слова. Паглядзіце самі ў таблічцы ніжэй, як будзе выглядаць субдыскрэтызацыя кожнага асобнага кампанента як у RGB, так і ў YCbCr.

Як уладкованы фармат JPEG
(Інтэрактыўная версія - у арыгінал артыкулы).

Выдаленне сіняга не так прыкметна, як чырвонага ці зялёнага. Усё таму, што з шасці мільёнаў колбачак у вашых вачах каля 64% адчувальныя да чырвонага, 32% да зялёнага і 2% да сіняга.

Субдыскрэтызацыя кампанента Y (злева ўнізе) бачная лепш за ўсё. Прыкметна нават невялікая змена.

Пераўтварэнне выявы з RGB у YCbCr не памяншае памер файла, але палягчае пошук менш прыкметных дэталяў, якія можна выдаліць. Сціск са стратамі адбываецца на другім этапе. У яе аснове ляжыць ідэя прадстаўлення даных у больш сціскаемым выглядзе.

2. Дыскрэтнае косінуснае пераўтварэнне і дыскрэтызацыя

Гэты ўзровень сціску па большай частцы і вызначае сутнасць JPEG. Пасля пераўтварэння кветак у YCbCr кампаненты сціскаюцца па асобнасці, таму далей мы можам сканцэнтравацца толькі на кампаненце Y. І вось як выглядаюць байты кампанента Y пасля ўжывання гэтага ўзроўня.

Як уладкованы фармат JPEG
(Інтэрактыўная версія - у арыгінал артыкулы). У інтэрактыўнай версіі клік на пікселі пракручвае рэдактар ​​на радок, які яго абазначае. Паспрабуйце выдаляць лікі з канца або дадаць некалькі нулёў да вызначанага ліку.

На першы погляд, выглядае, як вельмі дрэнны сціск. У малюнку 100 000 пікселяў, і для абазначэння іх яркасці (Y-кампаненты) патрабуецца 102 400 лікаў - гэта горш, чым калі наогул нічога не сціскаць!

Аднак звернеце ўвагу на тое, што большасць гэтых лікаў роўныя нулю. Больш за тое, усе гэтыя нулі ў канцы радкоў можна выдаляць, не мяняючы малюнак. Застаецца каля 26 000 лікаў, а гэта ўжо амаль у 4 разы менш!

На гэтым узроўні знаходзіцца сакрэт шахматных узораў. У адрозненне ад іншых эфектаў, якія мы бачылі, з'яўленне гэтых узораў не з'яўляецца глюкам. Яны - будаўнічыя блокі ўсяго малюнка. У кожным радку рэдактара ўтрымоўваецца роўна 64 лікі, каэфіцыенты дыскрэтнага косінусного пераўтварэнні (DCT), якія адпавядаюць інтэнсіўнасцям 64-х унікальных узораў.

Гэтыя ўзоры фармуюцца на аснове графіка косінуса. Вось, як выглядаюць некаторыя з іх:

Як уладкованы фармат JPEG
8 з 64 каэфіцыентаў

Ніжэй – выява, якая дэманструе ўсе 64 узоры.

Як уладкованы фармат JPEG
(Інтэрактыўная версія - у арыгінал артыкулы).

Гэтыя ўзоры маюць асаблівае значэнне, паколькі яны фармуюць базіс малюнкаў памеру 8х8. Калі вы незнаёмыя з лінейнай алгебрай, тое гэта азначае, што любы малюнак памеру 8х8 можна атрымаць з гэтых 64-х узораў. DCT - гэта працэс разбіцця малюнкаў на блокі 8х8 і пераўтварэнні кожнага блока ў камбінацыю з гэтых 64 каэфіцыентаў.

Тое, што любы малюнак можна скласці з 64 пэўных узораў, здаецца чараўніцтвам. Аднак гэта тое ж самае, што сказаць, што любое месца на Зямлі можна апісаць двума лікамі - шырынёй і даўгатой [з указаннем паўшар'яў / заўв. перав.]. Мы часта лічым паверхню Зямлі двухмернай, таму нам патрабуюцца ўсяго два лікі. Выява 8х8 мае 64 вымярэнні, таму нам патрабуюцца 64 лікі.

Пакуль незразумела, як гэта дапамагае нам у сэнсе сціску. Калі нам трэба 64 чысла для прадстаўлення выявы 8х8, чаму гэты спосаб будзе лепш, чым проста захоўваць 64 кампаненты яркасці? Мы робім гэта па той жа прычыне, па якой мы ператварылі тры лікі RGB у тры лікі YCbCr: гэта дазваляе нам выдаліць незаўважныя дэталі.

Складана ўбачыць, якія менавіта дэталі выдаляюцца на гэтым этапе, паколькі JPEG ужывае DCT да блокаў 8х8. Аднак ніхто не забараняе нам прымяніць яго да цэлага малюнка. Вось, як выглядае DCT па кампаненце Y у ўжыванні да цэлага малюнка:

Як уладкованы фармат JPEG

З канца можна выдаліць больш за 60 000 лікаў практычна без прыкметных змен на фотцы.

Як уладкованы фармат JPEG

Аднак адзначыце, што калі мы абнулім першыя пяць лікаў, розніца будзе відавочнай.

Як уладкованы фармат JPEG

Лічбы ў пачатку абазначаюць змены нізкай частаты ў малюнку, і нашы вочы ўлоўліваюць іх лепш за ўсё. Лічбы бліжэй да канца абазначаюць змены высокіх частот, якія складаней заўважыць. Каб "убачыць тое, што не відаць вокам", мы можам ізаляваць гэтыя дэталі высокай частаты, абнуліўшы першыя 5000 лікаў.

Як уладкованы фармат JPEG

Мы бачым усе вобласці выявы, у якіх адбываецца найбольшая змена ад пікселя да пікселя. Вылучаюцца вочы ката, яго вусы, махрыстая коўдра і цені ў ніжнім левым куце. Можна пайсці і далей, абнуліўшы першыя 10 000 лікаў:

Як уладкованы фармат JPEG

20 000:

Як уладкованы фармат JPEG

40 000:

Як уладкованы фармат JPEG

60 000:

Як уладкованы фармат JPEG

Гэтыя высокачашчынныя дэталі JPEG і выдаляе на этапе сціску. Пераўтварэнне кветак у каэфіцыенты DCT не нясе страт. Страты ўтвараюцца на кроку дыскрэтызацыі, дзе выдаляюцца велічыні высокай частаты ці блізкія да нуля. Калі вы паніжаеце якасць захавання JPEG, праграма павялічвае парог колькасці выдаляных значэнняў, што дае памяншэнне памеру файла, але робіць карцінку больш пікселізаванай. Таму малюнак у першым раздзеле, які быў у 57 разоў меншы, так выглядаў. Кожны блок 8х8 уяўляўся значна меншай колькасцю каэфіцыентаў DCT у параўнанні з больш якаснай версіяй.

Можна зрабіць такі круты эфект, як паступовая струменевая перадача малюнкаў. Можна вывесці размытую карцінку, якая становіцца ўсё больш дэталізаванай па меры запампоўкі ўсё большай колькасці каэфіцыентаў.

Вось, проста для цікавасці, што атрымаецца пры выкарыстанні ўсяго 24 000 лікаў:

Як уладкованы фармат JPEG

Або ўсяго 5000:

Як уладкованы фармат JPEG

Вельмі размыта, але як вядома!

3. Кадаваньне даўжынь сэрый, дэльта і Хафмана

Пакуль што ўсе этапы сціску ішлі са стратамі. Апошні этап, наадварот, ідзе без страт. Ён не выдаляе інфармацыю, аднак значна памяншае памер файла.

Як можна сціснуць штосьці, не адкідаючы інфармацыю? Прадстаўце, як бы мы апісалі просты чорны прастакутнік 700 х 437.

JPEG выкарыстоўвае для гэтага 5000 лікаў, але можна дасягнуць лепшага выніку. Можаце ўявіць сабе схему кадавання, якая б апісвала падобны малюнак як мага меншай колькасцю байт?

Мінімальная схема, якую змог прыдумаць я, выкарыстоўвае чатыры: тры для абазначэння колеру, і чацвёрты – колькі пікселяў мае такі колер. Ідэя падання паўтаральных значэнняў такім сціснутым спосабам завецца кадаванне даўжынь серый. Яна не мае страт, паколькі мы можам аднавіць закадаваныя дадзеныя ў першародным выглядзе.

Памер файла JPEG з чорным прастакутнікам значна больш 4 байт - успомніце, што на ўзроўні DCT сціск ужываецца да блокаў 8х8 пікселяў. Таму прынамсі нам патрэбен адзін каэфіцыент DCT на кожныя 64 пікселя. Адзін нам патрэбен таму, што замест таго, каб захоўваць адзін DCT-каэфіцыент, за якім ідзе 63 нуля, кадаваньне даўжынь серый дазваляе нам захоўваць адзін лік і пазначыць, што "ўсе астатнія - нулі".

Дэльта-кадаванне - гэта тэхніка, пры якой кожны байт змяшчае адрозненне ад нейкага значэння, а не абсалютную велічыню. Таму рэдагаванне вызначаных байтаў змяняе колер усіх астатніх пікселяў. Напрыклад, замест таго, каб захоўваць

12 13 14 14 14 13 13 14

Мы маглі б пачаць з 12, а потым проста пазначаць, колькі трэба дадаць ці адабраць, каб атрымаць наступную колькасць. І гэтая паслядоўнасць у дэльта-кадаванні набывае выгляд:

12 1 1 0 0 -1 0 1

Пераўтвораныя дадзеныя не атрымліваюцца менш зыходных, але сціскаць іх ужо лягчэй. Ужыванне дэльта-кадавання перад кадаваннем даўжынь серый можа моцна дапамагчы, застаючыся пры гэтым сціскам без страт.

Дэльта-кадаванне - адна з нямногіх тэхнік, якія ўжываюцца па-за блокамі 8х8. З 64 каэфіцыентаў DCT адзін - проста пастаянная хвалевая функцыя (суцэльны колер). Ён уяўляе сярэднюю яркасць кожнага блока для кампанентаў яркасці, або сярэдні блакіт для кампанентаў Cb, і гэтак далей. Першае значэнне кожнага DCT-блока называецца DC-значэннем, і кожнае DC-значэнне праходзіць дэльта-кадаваньне ў адносінах да папярэдніх. Таму змена яркасці першага блока паўплывае на ўсе блокі.

Застаецца апошняя загадка: як змена адзінага ліку цалкам псуе ўсю карцінку? Пакуль такіх уласцівасцей ва ўзроўнях сціску не было. Адказ ляжыць у загалоўку JPEG. Першыя 500 байт утрымоўваюць метададзеныя аб малюнку - шырыню, вышыню, і інш., І пакуль мы з імі не працавалі.

Без загалоўка практычна немагчыма (ну, ці вельмі складана) дэкадаваць JPEG. Гэта будзе выглядаць так, быццам я спрабую апісаць вам карціну, і пачынаю вынаходзіць словы для таго, каб перадаць сваё ўражанне. Апісанне будзе, верагодна, вельмі сціснутым, паколькі я магу вынаходзіць словы менавіта з тым значэннем, якое я жадаю перадаць, аднак для ўсіх астатніх яны не будуць мець сэнсу.

Гучыць недарэчна, але менавіта так гэта і адбываецца. Кожная выява JPEG сціскаецца з кодамі, спецыфічнымі менавіта для яго. Слоўнік кодаў захоўваецца ў загалоўку. Гэтая тэхніка называецца «код Хафмана», а слоўнік - табліцай Хафмана. У загалоўку табліца адзначана двума байтамі - 255 і потым 196. У кожнага каляровага кампанента можа быць свая табліца.

Змены табліц радыкальна паўплываюць на любы малюнак. Добры прыклад - памяняць на 15-м радку 1 на 12.

Як уладкованы фармат JPEG

Гэта адбываецца таму, што ў табліцах паказваецца, як трэба чытаць асобныя біты. Пакуль што мы працавалі толькі з двайковымі лікамі ў дзесятковым выглядзе. Але гэта хавае ад нас той факт, што калі вы жадаеце захоўваць лік 1 у байце, тое яно будзе выглядаць, як 00000001, паколькі ў кожным байце павінна быць роўна восем біт, нават калі патрэбен з іх усяго адзін.

Патэнцыйна гэта вялікая марнаванне месца, калі ў вас ёсць шмат дробных лікаў. Код Хафмана - гэта тэхніка, якая дазваляе нам аслабіць гэтае патрабаванне, па якім кожны лік павінна займаць восем біт. Гэта значыць, што калі вы бачыце два байта:

234 115

Тое, у залежнасці ад табліцы Хафмана, гэта могуць быць тры лікі. Каб іх атрымаць, вам трэба спачатку разбіць іх на асобныя біты:

11101010 01110011

Потым звяртаемся да табліцы, каб зразумець, як іх групаваць. Да прыкладу, гэта могуць быць першыя шэсць бітаў, (111010), ці 58 у дзесятковай сістэме, за якімі ідуць пяць бітаў (10011), ці 19, і нарэшце апошнія чатыры біта (0011), ці 3.

Таму вельмі складана разабрацца ў байтах на гэтым этапе сціску. Байты не ўяўляюць тое, што здаецца. Не буду паглыбляцца ў дэталі працы з табліцай у дадзеным артыкуле, але матэрыялаў па гэтым пытанні ў сетцы дастаткова.

Адзін з цікавых трукаў, якія можна прарабіць, ведаючы гэта - аддзяліць загаловак ад JPEG і захоўваць яго асобна. Па сутнасці, атрымаецца, што файл зможаце прачытаць толькі вы. Facebook робіць гэта, каб яшчэ мацней памяншаць файлы.

Што яшчэ можна зрабіць - зусім трохі змяніць табліцу Хаффмана. Для іншых гэта будзе выглядаць, як сапсаваная карцінка. І толькі вы будзеце ведаць чароўны варыянт яе выпраўлення.

Падвядзем вынікі: дык што ж трэба для дэкадавання JPEG? Неабходна:

  1. Выняць табліцу (табліцы) Хаффмана з загалоўка і дэкадаваць біты.
  2. Выняць каэфіцыенты дыскрэтнага косинусного пераўтварэнні для кожнага кампанента колеру і яркасці для кожнага блока 8х8, правядучы зваротныя пераўтварэнні кадавання даўжынь серый і дэльты.
  3. Скамбінаваць косінусы на аснове каэфіцыентаў, каб атрымаць значэння пікселяў для кожнага блока 8х8.
  4. Маштабаваць кампаненты кветак, калі праводзілася субдыскрэтызацыя (гэтая інфармацыя ёсць у загалоўку).
  5. Пераўтварыць атрыманыя значэнні YCbCr для кожнага пікселя ў RGB.
  6. Вывесці малюнак на экран!

Сур'ёзная праца для простага прагляду фоткі з коцікам! Аднак, што мне ў гэтым падабаецца відаць, наколькі тэхналогія JPEG чалавекацэнтрычная. Яна заснавана на асаблівасцях нашага ўспрымання, якія дазваляюць дасягнуць значна лепшага сціску, чым звычайныя тэхналогіі. І зараз, разумеючы, як працуе JPEG, можна ўявіць, як гэтыя тэхналогіі можна перанесці ў іншыя вобласці. Напрыклад, дэльта-кадаванне ў відэа можа даць сур'ёзнае памяншэнне памеру файла, паколькі там часта ёсць цэлыя вобласці, якія не змяняюцца ад кадра да кадра (напрыклад, фон).

Код, выкарыстаны ў артыкуле, Адкрыты, і змяшчае інструкцыі па замене карцінак на свае ўласныя.

Крыніца: habr.com

Дадаць каментар