JPEG пішімі қалай жұмыс істейді

JPEG кескіндері сандық өмірімізде кең таралған, бірақ бұл хабардарлықтың артында адам көзіне көрінбейтін бөлшектерді алып тастайтын алгоритмдер бар. Нәтиже - ең кішкентай файл өлшеміндегі ең жоғары көрнекі сапа - бірақ бәрі қалай жұмыс істейді? Біздің көзіміз нені көрмейтінін көрейік!

JPEG пішімі қалай жұмыс істейді

Досыңызға фотосурет жіберу және олар қандай құрылғыны, браузерді немесе операциялық жүйені қолданып жатқаны туралы алаңдамай-ақ қою оңай, бірақ бұл әрдайым бола бермейді. 1980 жылдардың басында компьютерлер сандық кескіндерді сақтай және көрсете алатын, бірақ мұны істеудің ең жақсы жолы туралы көптеген бәсекелес идеялар болды. Суретті бір компьютерден екіншісіне жіберіп, ол жұмыс істейді деп үміттене алмайсыз.

Бұл мәселені шешу үшін 1986 жылы дүние жүзінен сарапшылар комитеті құрылды.Фотосурет мамандарының бірлескен тобы» (Joint Photographic Experts Group, JPEG), штаб-пәтері Женевада, Швейцарияда орналасқан Халықаралық стандарттау ұйымы (ISO) мен Халықаралық электротехникалық комиссия (IEC) арасындағы бірлескен күш ретінде құрылған.

JPEG деп аталатын адамдар тобы 1992 жылы JPEG сандық кескінді қысу стандартын жасады. Интернетті пайдаланған кез келген адам JPEG кодталған кескіндерді кездестірген болуы мүмкін. Бұл кескіндерді кодтаудың, жіберудің және сақтаудың ең кең таралған тәсілі. Веб-беттерден электрондық поштаға дейін әлеуметтік медиаға дейін JPEG күніне миллиардтаған рет пайдаланылады — іс жүзінде біз суретті желіде көрген сайын немесе оны жіберген сайын. JPEG болмаса, веб азырақ түсті, баяу және мысық суреттері аз болар еді!

Бұл мақала JPEG кескінін декодтау әдісі туралы. Басқаша айтқанда, компьютерде сақталған қысылған деректерді экранда пайда болатын кескінге түрлендіру үшін не қажет. Бұл біз күнделікті қолданатын технологияны түсіну маңызды болғандықтан ғана емес, сонымен қатар қысу деңгейлерінің құлпын ашу арқылы қабылдау және көру және көзіміздің қандай бөлшектерге ең сезімтал екендігі туралы көбірек білеміз.

Сонымен қатар, суреттермен осылай ойнау өте қызықты.

JPEG пішімі қалай жұмыс істейді

JPEG ішіне қарау

Компьютерде барлығы екілік сандар тізбегі ретінде сақталады. Әдетте бұл биттер, нөлдер және бірліктер байттарды құрау үшін сегізден тұратын топтарға топтастырылады. Компьютерде JPEG кескінін ашқан кезде, бір нәрсе (браузер, операциялық жүйе, басқа нәрсе) байттарды декодтауы керек, бастапқы кескінді көрсетілетін түстер тізімі ретінде қалпына келтіреді.

Осы тәттіні жүктеп алсаңыз мысықтың фотосы және оны мәтіндік редакторда ашсаңыз, сіз көптеген сәйкес емес таңбаларды көресіз.

JPEG пішімі қалай жұмыс істейді
Мұнда мен файлдың мазмұнын тексеру үшін Notepad++ пайдаланамын, өйткені Windows жүйесіндегі Блокнот сияқты кәдімгі мәтіндік редакторлар сақталғаннан кейін екілік файлды бүлдіреді және ол енді JPEG пішімін қанағаттандырмайды.

Мәтіндік процессорда кескінді ашу компьютерді шатастырады, көзіңізді уқалап, түрлі-түсті дақтарды көре бастағанда миыңызды шатастыратын сияқты!

Сіз көріп отырған бұл нүктелер деп аталады фосфендер, және ақыл-ой тудыратын жеңіл ынталандырудың немесе галлюцинацияның нәтижесі емес. Олар сіздің миыңыз оптикалық нервтердегі кез келген электрлік сигналдар жарық туралы ақпаратты береді деп ойлайтындықтан пайда болады. Ми бұл болжамдарды жасауы керек, өйткені сигналдың дыбыс, көрініс немесе басқа нәрсе екенін білудің ешқандай жолы жоқ. Денедегі барлық жүйкелер бірдей электрлік импульстарды береді. Көзіңізге қысым жасау арқылы сіз визуалды емес сигналдарды жібересіз, бірақ сіздің миыңыз түсіндіретін көз рецепторларын белсендіреді - бұл жағдайда, дұрыс емес - көрнекі нәрсе ретінде. Сіз қысымды тікелей көре аласыз!

Компьютерлердің миға қаншалықты ұқсас екендігі туралы ойлану күлкілі, бірақ бұл сонымен бірге деректердің мағынасы - жүйке арқылы дене арқылы тасымалдануы немесе компьютерде сақталуы - оның түсіндірілуіне қаншалықты байланысты екенін көрсету үшін пайдалы ұқсастық. Барлық екілік деректер кез келген түрдегі ақпаратты жеткізе алатын негізгі құрамдас бөліктер XNUMX және XNUMX сандарынан тұрады. Компьютер файл кеңейтімдері сияқты анықтамаларды пайдалану арқылы оларды қалай түсіндіру керектігін жиі анықтайды. Енді біз оны мәтін ретінде түсіндіруге мәжбүрлейміз, өйткені мәтіндік редактор осылай күтеді.

JPEG кодты қалай декодтау керектігін түсіну үшін бастапқы сигналдардың өздерін – екілік деректерді көруіміз керек. Мұны он алтылық редактордың көмегімен немесе тікелей қосу арқылы жасауға болады түпнұсқа мақала веб-парағы! Кескін бар, оның жанында мәтіндік өрісте оның барлық байттары (тақырыптан басқа) ондық түрде берілген. Сіз оларды өзгерте аласыз және сценарий қайта кодталады және жылдам жаңа кескін жасайды.

JPEG пішімі қалай жұмыс істейді

Осы редактормен ойнау арқылы көп нәрсені үйренуге болады. Мысалы, пикселдердің қандай ретпен сақталғанын айта аласыз ба?

Бұл мысалдың бір қызығы, кейбір сандарды өзгерту кескінге мүлдем әсер етпейді, бірақ, мысалы, бірінші жолдағы 17 санын 0-ге ауыстырсаңыз, фото толығымен бұзылады!

JPEG пішімі қалай жұмыс істейді

Басқа өзгертулер, мысалы, 7 жолындағы 1988 санын 254 санымен ауыстыру, түсін өзгертеді, бірақ тек кейінгі пикселдердің.

JPEG пішімі қалай жұмыс істейді

Мүмкін, ең қызық нәрсе - кейбір сандар тек түсін ғана емес, кескіннің пішінін де өзгертеді. 70-жолдағы 12-ті 2-ге өзгертіп, не айтқым келгенін көру үшін суреттің жоғарғы жолына қараңыз.

JPEG пішімі қалай жұмыс істейді

Қандай JPEG кескінін пайдалансаңыз да, байттарды өңдеу кезінде сіз әрқашан осы жұмбақ шахмат үлгілерін таба аласыз.

Редактормен ойнаған кезде фотосуреттің осы байттардан қалай қайта жасалатынын түсіну қиын, өйткені JPEG қысу деңгейлері бойынша дәйекті түрде қолданылатын үш түрлі технологиядан тұрады. Біз көріп отырған жұмбақ мінез-құлықты ашу үшін әрқайсысын бөлек зерттейміз.

JPEG қысуының үш деңгейі:

  1. Түсті қосалқы үлгілеу.
  2. Дискретті косинусты түрлендіру және іріктеу.
  3. Ұзындықты кодтауды іске қосыңыз, delta и Хаффман

Қысудың шамасы туралы түсінік беру үшін жоғарыдағы сурет 79 819 санды немесе шамамен 79 КБ-ты білдіретінін ескеріңіз. Егер біз оны қысусыз сақтасақ, әрбір пиксель үш санды қажет етеді - қызыл, жасыл және көк компоненттер үшін. Бұл 917 700 нөмірді немесе шамамен. 917 КБ. JPEG қысу нәтижесінде соңғы файл 10 еседен астам қысқартылды!

Шын мәнінде, бұл кескінді әлдеқайда қысуға болады. Төменде екі сурет қатар орналасқан - оң жақтағы фотосурет 16 КБ дейін қысылған, яғни қысылмаған нұсқадан 57 есе аз!

JPEG пішімі қалай жұмыс істейді

Егер сіз мұқият қарасаңыз, бұл суреттердің бірдей емес екенін көресіз. Олардың екеуі де JPEG сығымдалған кескіндер, бірақ оң жақ көлемі әлдеқайда аз. Ол сондай-ақ сәл нашар көрінеді (фон түсті квадраттарды қараңыз). Сондықтан JPEG файлын жоғалтатын қысу деп те атайды; Қысу процесінде кескін өзгереді және кейбір мәліметтерді жоғалтады.

1. Түсті ішкі үлгілеу

Мұнда қысудың бірінші деңгейі ғана қолданылған кескін берілген.

JPEG пішімі қалай жұмыс істейді
(Интерактивті нұсқа – в түпнұсқа мақалалар). Бір санды алып тастау барлық түстерді бұзады. Дегенмен, егер дәл алты сан жойылса, бұл кескінге іс жүзінде ешқандай әсер етпейді.

Енді сандарды шешу оңайырақ. Бұл әр байт дәл бір пиксельді өзгертетін түстердің қарапайым тізімі дерлік, бірақ сонымен бірге ол қысылмаған кескіннің жартысына тең (осы кішірейтілген өлшемде шамамен 300 КБ алады). Неге екенін болжай аласыз ба?

Бұл сандар стандартты қызыл, жасыл және көк құрамдастарды көрсетпейтінін көруге болады, өйткені егер біз барлық сандарды нөлге ауыстырсақ, жасыл кескін аламыз (ақ емес).

JPEG пішімі қалай жұмыс істейді

Себебі бұл байттар Y (жарықтық) білдіреді

JPEG пішімі қалай жұмыс істейді

Cb (салыстырмалы көк),

JPEG пішімі қалай жұмыс істейді

және Cr (салыстырмалы қызару) суреттері.

JPEG пішімі қалай жұмыс істейді

Неліктен RGB қолданбасқа? Өйткені, қазіргі заманғы экрандардың көпшілігі осылай жұмыс істейді. Мониторыңыз кез келген түсті, соның ішінде қызыл, жасыл және көк түсті, әр пиксел үшін әртүрлі қарқындылықпен көрсете алады. Ақ түс үшеуін толық жарықтықта қосу арқылы, ал қара түс өшіру арқылы алынады.

JPEG пішімі қалай жұмыс істейді

Бұл да адам көзінің жұмысына өте ұқсас. Біздің көзіміздегі түсті рецепторлар «деп аталады.конустар«, және үш түрге бөлінеді, олардың әрқайсысы қызыл, жасыл немесе көк түстерге сезімтал [S-типті конустар күлгін-көк түске сезімтал (ағылш. Қысқа - қысқа толқын спектрінен S), M. -түрі - жасыл-сары (ағылшын тілінен алынған M Medium - орташа толқынды) және L-типі - спектрдің сары-қызыл (ағылш. Long - ұзын толқын) бөліктерінде. Конустардың осы үш түрінің болуы (және спектрдің изумруд жасыл бөлігінде сезімтал таяқшалар) адамға түсті көруді береді. / шамамен. аудар.]. Таяқтарды, біздің көзіміздегі фоторецепторлардың тағы бір түрі жарықтықтағы өзгерістерді анықтауға қабілетті, бірақ түске әлдеқайда сезімтал. Біздің көзімізде шамамен 120 миллион таяқша және тек 6 миллион конус бар.

Міне, сондықтан біздің көздер түстің өзгеруінен гөрі жарықтықтағы өзгерістерді жақсырақ анықтайды. Түсті жарықтықтан ажыратсаңыз, аздап түсті алып тастай аласыз және ешкім ештеңе байқамайды. Chroma subsempling — кескіннің түс құрамдастарын жарықтық құрамдастарына қарағанда төмен ажыратымдылықпен көрсету процесі. Жоғарыдағы мысалда әрбір пикселде дәл бір Y компоненті бар және төрт пикселден тұратын әрбір жеке топта дәл бір Cb және бір Cr компоненті бар. Сондықтан кескінде түпнұсқаға қарағанда төрт есе аз түсті ақпарат бар.

YCbCr түс кеңістігі JPEG форматында ғана қолданылмайды. Ол алғашында 1938 жылы телебағдарламалар үшін ойлап табылған. Әркімде түрлі-түсті теледидар бола бермейді, сондықтан түс пен жарықтықты ажырату барлығына бірдей сигнал алуға мүмкіндік берді, ал түсі жоқ теледидарлар тек жарықтық құрамдас бөлігін ғана пайдаланды.

Сондықтан редактордан бір нөмірді алып тастау барлық түстерді толығымен бұзады. Құрамдас бөліктер Y Y Y Y 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 пиксель бар және олардың жарықтығын көрсету үшін 102 400 сан қажет (Y-компоненттері) — бұл ешнәрсені қыспаудан да жаман!

Дегенмен, бұл сандардың көпшілігі нөлге тең екенін ескеріңіз. Сонымен қатар, жолдардың соңындағы барлық нөлдерді кескінді өзгертпестен алып тастауға болады. 26 000-ға жуық нөмір қалды, бұл шамамен 4 есе аз!

Бұл деңгейде шахмат өрнектерінің құпиясы бар. Біз көрген басқа әсерлерден айырмашылығы, бұл үлгілердің пайда болуы ақаулық емес. Олар бүкіл кескіннің құрылыс блоктары болып табылады. Редактордың әрбір жолында дәл 64 сан, 64 бірегей үлгінің қарқындылығына сәйкес келетін дискретті косинус түрлендіру (DCT) коэффициенттері бар.

Бұл үлгілер косинус графигі негізінде құрылады. Міне, олардың кейбіреулері қалай көрінеді:

JPEG пішімі қалай жұмыс істейді
8-тен 64 коэффициент

Төменде барлық 64 үлгіні көрсететін сурет берілген.

JPEG пішімі қалай жұмыс істейді
(Интерактивті нұсқа – в түпнұсқа мақалалар).

Бұл үлгілердің ерекше маңызы бар, өйткені олар 8x8 кескіндердің негізін құрайды. Егер сіз сызықтық алгебрамен таныс болмасаңыз, бұл кез келген 8x8 кескінді осы 64 үлгіден жасауға болатынын білдіреді. DCT - кескіндерді 8x8 блоктарға бөлу және әрбір блокты осы 64 коэффициенттердің комбинациясына түрлендіру процесі.

Кез келген кескіннің 64 нақты өрнектен тұруы сиқырлы сияқты. Дегенмен, бұл Жердегі кез келген орынды екі санмен сипаттауға болады дегенмен бірдей - ендік пен бойлық [жарты шарларды көрсететін / шамамен. аудар.]. Біз жиі Жер бетін екі өлшемді деп ойлаймыз, сондықтан бізге тек екі сан қажет. 8x8 кескіннің 64 өлшемі бар, сондықтан бізге 64 сан қажет.

Бұл қысу тұрғысынан бізге қалай көмектесетіні әлі белгісіз. 64x8 кескінді көрсету үшін бізге 8 сан қажет болса, бұл 64 жарықтық құрамдастарын сақтаудан гөрі неге жақсырақ болар еді? Біз мұны үш RGB нөмірін үш YCbCr нөміріне айналдырғандықтан жасаймыз: бұл бізге нәзік мәліметтерді жоюға мүмкіндік береді.

Бұл кезеңде нақты қандай мәліметтер жойылатынын көру қиын, себебі JPEG 8x8 блоктарына DCT қолданады. Дегенмен, оны бүкіл суретке қолдануға ешкім тыйым салмайды. Бүкіл суретке қолданылатын Y компоненті үшін DCT келесідей көрінеді:

JPEG пішімі қалай жұмыс істейді

60 000-нан астам нөмірді фотосуретте айтарлықтай өзгерістерсіз соңынан алып тастауға болады.

JPEG пішімі қалай жұмыс істейді

Дегенмен, егер біз алғашқы бес санды нөлден шығарсақ, айырмашылық анық болатынын ескеріңіз.

JPEG пішімі қалай жұмыс істейді

Басындағы сандар біздің көзіміз жақсы қабылдайтын кескіндегі төмен жиілікті өзгерістерді білдіреді. Соңындағы сандар жоғары жиіліктердегі өзгерістерді көрсетеді, оларды байқау қиынырақ. «Көз көре алмайтын нәрсені көру» үшін біз алғашқы 5000 санды нөлге келтіру арқылы осы жоғары жиілікті мәліметтерді оқшаулай аламыз.

JPEG пішімі қалай жұмыс істейді

Біз пиксельден пикселге ең үлкен өзгеріс болатын кескіннің барлық аймақтарын көреміз. Мысықтың көздері, оның мұрттары, түкті көрпе және төменгі сол жақ бұрыштағы көлеңкелер ерекшеленеді. Алғашқы 10 000 санды нөлден шығару арқылы әрі қарай жүре аласыз:

JPEG пішімі қалай жұмыс істейді

20 000:

JPEG пішімі қалай жұмыс істейді

40 000:

JPEG пішімі қалай жұмыс істейді

60 000:

JPEG пішімі қалай жұмыс істейді

Бұл жоғары жиілікті мәліметтер қысу кезеңінде JPEG арқылы жойылады. Түстерді DCT коэффициенттеріне түрлендіруде ешқандай шығын болмайды. Жоғалту жоғары жиілікті немесе нөлге жақын мәндер жойылатын іріктеу қадамында орын алады. JPEG сақтау сапасын төмендеткен кезде, бағдарлама жойылған мәндер санының шегін арттырады, бұл файл өлшемін азайтады, бірақ суретті пиксельді етеді. Сондықтан бірінші бөлімдегі 57 есе кіші сурет осылай болып шықты. Әрбір 8x8 блок жоғары сапалы нұсқамен салыстырғанда әлдеқайда аз DCT коэффициенттерімен ұсынылған.

Сіз суреттерді біртіндеп ағынмен жіберу сияқты керемет әсер жасай аласыз. Көбірек коэффициенттер жүктелген сайын егжей-тегжейлі болатын бұлыңғыр суретті көрсетуге болады.

Мұнда тек көңіл көтеру үшін небәрі 24 000 нөмірді пайдалана аласыз:

JPEG пішімі қалай жұмыс істейді

Немесе 5000:

JPEG пішімі қалай жұмыс істейді

Өте бұлыңғыр, бірақ қандай да бір түрде танылады!

3. Ұзындықты кодтауды, дельтаны және Хаффманды іске қосыңыз

Осы уақытқа дейін қысудың барлық кезеңдері жоғалтты. Соңғы кезең, керісінше, шығынсыз өтеді. Ол ақпаратты жоймайды, бірақ файл өлшемін айтарлықтай азайтады.

Ақпаратты тастамай, бір нәрсені қалай қысуға болады? Қарапайым қара тіктөртбұрышты 700 x 437 қалай сипаттайтынымызды елестетіп көріңіз.

JPEG бұл үшін 5000 нөмірді пайдаланады, бірақ әлдеқайда жақсы нәтижелерге қол жеткізуге болады. Мұндай кескінді мүмкіндігінше аз байтпен сипаттайтын кодтау схемасын елестете аласыз ба?

Мен ойлап таба алатын минималды схема төртеуін пайдаланады: үшеуі түсті көрсету үшін және төртіншісі сол түстің қанша пикселі бар екенін көрсету үшін. Қайталанатын мәндерді қысқартылған түрде көрсету идеясы жұмыс ұзындығы кодтау деп аталады. Бұл жоғалтпайды, өйткені біз кодталған деректерді бастапқы пішініне қайтара аламыз.

Қара тіктөртбұрышты JPEG файлы 4 байттан әлдеқайда үлкен - DCT деңгейінде қысу 8x8 пиксель блоктарына қолданылатынын есте сақтаңыз. Сондықтан, кем дегенде, әрбір 64 пиксел үшін бір DCT коэффициенті қажет. Бізге бір қажет, өйткені бір DCT коэффициентінен кейін 63 нөлді сақтаудың орнына, жүгіру ұзындығын кодтау бір санды сақтауға және «қалғандарының барлығы нөл» екенін көрсетуге мүмкіндік береді.

Delta-кодтау - бұл әрбір байт абсолютті мәннен гөрі кейбір мәннен айырмашылықты қамтитын әдіс. Сондықтан белгілі байттарды өңдеу барлық басқа пикселдердің түсін өзгертеді. Мысалы, сақтаудың орнына

12 13 14 14 14 13 13 14

Біз 12-ден бастай аламыз, содан кейін келесі санды алу үшін қанша қосу немесе азайту керек екенін көрсетуге болады. Және дельта кодтаудағы бұл реттілік келесі пішінді алады:

12 1 1 0 0 -1 0 1

Түрлендірілген деректер бастапқы деректерден кіші емес, бірақ оны қысу оңайырақ. Жұмыс ұзақтығын кодтау алдында дельта кодтауын қолдану жоғалтпай қысу кезінде көп көмектесе алады.

Delta-кодтау 8x8 блоктарынан тыс қолданылатын бірнеше әдістердің бірі болып табылады. 64 DCT коэффициентінің біреуі жай ғана тұрақты толқындық функция (тұтас түс). Ол luma құрамдастары үшін әрбір блоктың орташа жарықтығын немесе Cb құрамдастары үшін орташа көктікті және т.б. көрсетеді. Әрбір DCT блогының бірінші мәні DC мәні деп аталады, ал әрбір тұрақты ток мәні алдыңғыларға қатысты дельта кодталған. Сондықтан бірінші блоктың жарықтығын өзгерту барлық блоктарға әсер етеді.

Соңғы жұмбақ қалады: сингулярды өзгерту бүкіл суретті қалай толығымен бұзады? Әзірге қысу деңгейлері мұндай қасиеттерге ие болмады. Жауап JPEG тақырыбында. Алғашқы 500 байт кескін туралы метадеректерді қамтиды - ені, биіктігі және т.б. және біз олармен әлі жұмыс істеген жоқпыз.

Тақырыпсыз JPEG кодын декодтау мүмкін емес (немесе өте қиын). Мен сізге суретті суреттеуге тырысатын сияқтымын, мен өз әсерімді жеткізу үшін сөздерді ойлап табуға кірісемін. Сипаттама өте қысқартылған болуы мүмкін, өйткені мен жеткізгім келетін мағынасы бар сөздерді ойлап таба аламын, бірақ басқалары үшін олардың мағынасы болмайды.

Бұл ақымақ естіледі, бірақ дәл солай болады. Әрбір JPEG кескіні оған арнайы кодтармен қысылады. Код сөздігі тақырыпта сақталады. Бұл әдіс Хаффман коды деп аталады, ал сөздік Хаффман кестесі деп аталады. Тақырыпта кесте екі байтпен белгіленеді - 255, содан кейін 196. Әрбір түсті құрамдастың өз кестесі болуы мүмкін.

Кестелерді өзгерту кез келген кескінге түбегейлі әсер етеді. Жақсы мысал - 15-ші жолды 1-ге өзгерту.

JPEG пішімі қалай жұмыс істейді

Бұл кестелер жеке биттерді қалай оқу керектігін көрсететіндіктен орын алады. Осы уақытқа дейін біз тек ондық түрдегі екілік сандармен жұмыс істедік. Бірақ бұл бізден жасырады, егер сіз байтта 1 санын сақтағыңыз келсе, ол 00000001 сияқты көрінеді, өйткені әрбір байттың тек біреуі қажет болса да, дәл сегіз бит болуы керек.

Егер сізде аз сандар көп болса, бұл кеңістіктің үлкен шығыны болуы мүмкін. Хаффман коды - бұл әрбір сан сегіз бит болуы керек деген талапты жеңілдетуге мүмкіндік беретін әдіс. Бұл екі байтты көрсеңіз:

234 115

Содан кейін, Хаффман кестесіне байланысты бұл үш сан болуы мүмкін. Оларды алу үшін алдымен жеке биттерге бөлу керек:

11101010 01110011

Содан кейін оларды қалай топтастыру керектігін анықтау үшін кестеге қараймыз. Мысалы, бұл алғашқы алты бит (111010) немесе ондық 58, одан кейін бес бит (10011) немесе 19, ең соңында соңғы төрт бит (0011) немесе 3 болуы мүмкін.

Сондықтан қысудың осы сатысында байттарды түсіну өте қиын. Байттар олар көрінетін нәрсені білдірмейді. Мен осы мақалада кестемен жұмыс істеудің егжей-тегжейіне кірмеймін, бірақ материалдар осы мәселе бойынша онлайн жеткілікті.

Бұл біліммен жасауға болатын қызықты амалдардың бірі - тақырыпты JPEG файлынан бөліп, оны бөлек сақтау. Шын мәнінде, файлды тек сіз оқи аласыз. Facebook мұны файлдарды одан да кішірейту үшін жасайды.

Тағы не істеуге болады - Хаффман кестесін біршама өзгерту. Басқалар үшін бұл сынған сурет сияқты болады. Оны түзетудің сиқырлы әдісін тек сіз ғана білесіз.

Қорытындылайық: JPEG кодты декодтау үшін не қажет? Қажетті:

  1. Тақырыптан Хаффман кестесін/кестелерін шығарып, биттерді декодтаңыз.
  2. Кері жүгіру ұзындығы мен үшбұрышты кодтау түрлендірулерін орындай отырып, әрбір 8x8 блок үшін әрбір түс және жарықтық құрамдас үшін дискретті косинус түрлендіру коэффициенттерін шығарып алыңыз.
  3. Әрбір 8x8 блок үшін пиксель мәндерін алу үшін коэффициенттерге негізделген косинустарды біріктіріңіз.
  4. Ішкі үлгілеу орындалған болса, түс құрамдастарын масштабтаңыз (бұл ақпарат тақырыпта бар).
  5. Әрбір пиксел үшін алынған YCbCr мәндерін RGB түріне түрлендіріңіз.
  6. Суретті экранда көрсетіңіз!

Мысықпен суретті жай ғана қарауға арналған күрделі жұмыс! Дегенмен, маған ұнайтыны, ол JPEG технологиясының адамға бағытталғанын көрсетеді. Ол кәдімгі технологияларға қарағанда әлдеқайда жақсы сығымдауға қол жеткізуге мүмкіндік беретін біздің қабылдауымыздың ерекшеліктеріне негізделген. Енді JPEG қалай жұмыс істейтінін түсінгеннен кейін, біз бұл технологияларды басқа салаларға қалай беруге болатынын елестете аламыз. Мысалы, бейнедегі үшбұрышты кодтау файл өлшемін айтарлықтай азайтуды қамтамасыз ете алады, өйткені көбінесе кадрдан кадрға өзгермейтін тұтас аймақтар бар (мысалы, фон).

Мақалада қолданылған код, ашық және суреттерді өз суретіңізбен ауыстыру туралы нұсқауларды қамтиды.

Ақпарат көзі: www.habr.com

пікір қалдыру