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догу Notepad сыяктуу кадимки текст редакторлору сакталгандан кийин бинардык файлды бузуп, JPEG форматын канааттандырбай калат.

Көзүңүздү ушалап, түстүү тактарды көрө баштаганыңызда мээңизди чаташтыргандай эле, тексттик процессордо сүрөт ачуу компьютерди чаташтырат!

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

Компьютерлердин мээге канчалык окшош экени жөнүндө ойлонуу күлкүлүү, бирок бул маалыматтын мааниси – нервдер аркылуу дене аркылуу өтүшү же компьютерде сакталышы – анын интерпретациясынан канчалык көз каранды экенин көрсөтүү үчүн пайдалуу аналогия. Бардык экилик маалыматтар XNUMX жана XNUMXден турат, бул ар кандай түрдөгү маалыматты жеткире ала турган негизги компоненттер. Компьютериңиз көбүнчө файл кеңейтүүлөрү сыяктуу көрсөтмөлөрдү колдонуу менен аларды кантип чечмелөө керектигин аныктайт. Эми биз аны аларды текст катары чечмелөөгө мажбурлайбыз, анткени текст редактору ушуну күтөт.

JPEG коддон кантип болорун түшүнүү үчүн, биз баштапкы сигналдардын өздөрүн - бинардык маалыматтарды көрүшүбүз керек. Бул он алтылык редактордун жардамы менен же түз эле жасалса болот оригиналдуу макала веб-баракчасы! Сүрөт бар, анын жанында текст талаасында анын бардык байттары (башкачасынан башка), ондук формада берилген. Сиз аларды өзгөртө аласыз жана скрипт кайра коддоп, жаңы сүрөттү тез арада жаратат.

JPEG форматы кантип иштейт

Бул редактор менен ойноп эле көп нерсени үйрөнө аласыз. Мисалы, пикселдер кандай тартипте сакталганын айта аласызбы?

Бул мисалдын кызык жери, кээ бир сандарды өзгөртүү сүрөткө таптакыр таасир этпейт, бирок, мисалы, биринчи сапта 17 санын 0 менен алмаштырсаңыз, сүрөт толугу менен бузулат!

JPEG форматы кантип иштейт

Башка өзгөртүүлөр, мисалы, 7-саптагы 1988 санын 254 санына алмаштыруу, түсүн өзгөртөт, бирок кийинки пикселдердин гана.

JPEG форматы кантип иштейт

Балким, эң таң калыштуусу, кээ бир сандар сүрөттүн түсүн гана эмес, формасын да өзгөртөт. 70-саптагы 12ти 2ге алмаштырып, эмнени айткым келгенин көрүү үчүн сүрөттүн жогорку сапты караңыз.

JPEG форматы кантип иштейт

Жана кайсы JPEG сүрөтүн колдонбоңуз, байттарды түзөтүүдө бул сырдуу шахмат үлгүлөрүн таба аласыз.

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

JPEG кысуунун үч деңгээли:

  1. Түстүү үлгүлөрдү алуу.
  2. Дискреттик косинустарды өзгөртүү жана тандоо.
  3. Узундукту коддоону иштетүү, дельта и Хаффман

Сизге кысуу чоңдугу жөнүндө түшүнүк берүү үчүн, жогорудагы сүрөттө 79 819 санды же болжол менен 79 КБ камтылганына көңүл буруңуз. Эгерде биз аны кысуусуз сактасак, ар бир пиксел үч санды талап кылат - кызыл, жашыл жана көк компоненттер үчүн. Бул 917 700 санды түзөт же болжол менен. 917 KB. JPEG кысуунун натыйжасында акыркы файл 10 эседен ашык кыскарган!

Чынында, бул сүрөттү алда канча кысылышы мүмкүн. Төмөндө эки сүрөт жанаша жайгашкан - оң жактагы сүрөт 16 КБ чейин кысылган, башкача айтканда, кысылбаган версиядан 57 эсе кичине!

JPEG форматы кантип иштейт

Эгер жакшылап карасаңыз, бул сүрөттөр окшош эмес экенин көрөсүз. Экөө тең JPEG кысуу менен сүрөттөр, бирок туурасы көлөмү жагынан бир топ кичине. Ал ошондой эле бир аз начарраак көрүнөт (фондун түстүү квадраттарын караңыз). Ошондуктан JPEG да жоготуулуу кысуу деп аталат; Кысуу процессинде сүрөт өзгөрүп, кээ бир деталдарын жоготот.

1. Түстүү үлгүлөрдү алуу

Бул жерде кысуунун биринчи деңгээли гана колдонулган сүрөт.

JPEG форматы кантип иштейт
(Интерактивдүү версия - в оригиналдуу макалалар). Бир санды алып салуу бардык түстөрдү жок кылат. Бирок, эгер так алты сан алынып салынса, бул сүрөткө дээрлик эч кандай таасир этпейт.

Эми сандарды чечмелөө бир аз жеңилирээк. Бул дээрлик жөнөкөй түстөрдүн тизмеси, анда ар бир байт так бир пикселди өзгөртөт, бирок ошол эле учурда ал кысылбаган сүрөттүн жарым өлчөмүн түзөт (бул кыскартылган өлчөмдө 300 КБга жакынды ээлейт). Эмнеге экенин биле аласыңбы?

Бул сандар стандарттуу кызыл, жашыл жана көк компоненттерди билдирбей турганын көрүүгө болот, анткени бардык сандарды нөлгө алмаштырсак, биз жашыл сүрөттү алабыз (ак эмес).

JPEG форматы кантип иштейт

Себеби бул байттар Y (жарыктык) дегенди билдирет.

JPEG форматы кантип иштейт

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

JPEG форматы кантип иштейт

жана Cr (салыштырмалуу кызыл) сүрөттөр.

JPEG форматы кантип иштейт

Эмне үчүн RGB колдонбойсуз? Анткени, көпчүлүк заманбап экрандар ушундай иштейт. Сиздин мониторуңуз ар бир пиксел үчүн ар кандай интенсивдүүлүк менен кызыл, жашыл жана көк сыяктуу каалаган түстү көрсөтө алат. Ак түс үчөөнү тең толук жарыктыкта ​​күйгүзүү менен, ал эми караны өчүрүү менен алынат.

JPEG форматы кантип иштейт

Бул дагы адамдын көзүнүн иштешине абдан окшош. Көзүбүздөгү түс кабылдагычтар "деп аталат.конустар", жана үч түргө бөлүнөт, алардын ар бири кызыл, жашыл же көк түскө көбүрөөк сезгич [S-типтеги конустар кызгылт көк түскө сезгич (англисчеден S Кыска - кыска толкун спектри), M. -тип - жашыл-сары (англис тилинен М Medium - орто толкун), жана L-тип - сары-кызыл (англис тилинен L Long - узун толкун) спектрдин бөлүктөрүндө. Бул үч түрдөгү конустардын (жана спектрдин изумруд жашыл бөлүгүндө сезгич таякчалардын) болушу адамга түстүү көрүнүштү берет. / болжол менен. котормосу]. палочки, көзүбүздөгү фоторецептордун дагы бир түрү жарыктыктын өзгөрүшүн аныктоого жөндөмдүү, бирок түскө бир топ сезгич. Көзүбүздө 120 миллионго жакын таякча жана 6 миллион конус гана бар.

Мына ошондуктан биздин көзүбүз түстөгү өзгөрүүлөргө караганда жарыктыктын өзгөрүшүн бир топ жакшыраак байкайт. Эгерде сиз түстү жарыктан ажыратсаңыз, анда бир аз түстү алып салсаңыз болот жана эч ким эч нерсени байкабайт. Chroma subsampling - бул сүрөттөлүштүн түс компоненттерин жаркырагандык компоненттерине караганда азыраак чечилиште көрсөтүү процесси. Жогорудагы мисалда ар бир пикселдин так бир 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 пиксел бар жана алардын жарыктыгын көрсөтүү үчүн 102 400 сан керек (Y-компоненттери) — бул эч нерсени кысуудан да жаман!

Бирок, бул сандардын көбү нөл экенин белгилей кетүү керек. Мындан тышкары, саптардын аягындагы бардык нөлдөрдү сүрөттү өзгөртпөстөн алып салууга болот. 26 000ге жакын номер калды, бул дээрлик 4 эсе аз!

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

Бул схемалар косинус сюжетинин негизинде түзүлөт. Бул жерде алардын айрымдары кандай көрүнөт:

JPEG форматы кантип иштейт
8 коэффиценттен 64

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

JPEG форматы кантип иштейт
(Интерактивдүү версия - в оригиналдуу макалалар).

Бул үлгүлөр өзгөчө мааниге ээ, анткени алар 8x8 сүрөттөрдүн негизин түзөт. Эгер сиз сызыктуу алгебра менен тааныш эмес болсоңуз, анда бул 8 үлгүдөн каалаган 8x64 сүрөтүн жасоого болот дегенди билдирет. DCT бул сүрөттөрдү 8x8 блокторго бөлүү жана ар бир блокту ушул 64 коэффициенттин айкалышына айландыруу процесси.

Кандайдыр бир сүрөттөлүштүн 64 өзгөчө үлгүдөн турушу сыйкырдуу окшойт. Бирок, бул жер бетиндеги каалаган жер эки сан менен сүрөттөлүшү мүмкүн деген менен бирдей - кеңдик жана узундук [жарым шарларды көрсөтүү / болжол менен. котормосу]. Биз көбүнчө Жердин бетин эки өлчөмдүү деп ойлойбуз, ошондуктан бизге эки гана сан керек. 8x8 сүрөттүн 64 өлчөмү бар, ошондуктан бизге 64 сан керек.

Бул кысуу жагынан бизге кандай жардам берери азырынча белгисиз. 64x8 сүрөттү көрсөтүү үчүн бизге 8 сан керек болсо, эмне үчүн бул жөн гана 64 жарыктык компоненттерин сактагандан жакшыраак болот? Биз муну үч RGB номерин үч YCbCr номерине айландырганыбыз үчүн жасайбыз: бул бизге тымызын деталдарды жок кылууга мүмкүндүк берет.

JPEG 8x8 блокторуна DCTди колдонот, анткени бул этапта кайсы детал алынып салынганын так көрүү кыйын. Бирок, аны бүт сүрөткө колдонууга эч ким тыюу салбайт. Бул жерде 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 эсе кичирейген биринчи бөлүмдөгү сүрөт ушундай болгон. Ар бир 8x8 блок жогорку сапаттагы версияга салыштырмалуу алда канча аз DCT коэффициенттери менен берилген.

Сиз сүрөттөрдү акырындык менен агым сыяктуу сонун эффект түзө аласыз. Сиз бүдөмүк сүрөттү көрсөтө аласыз, ал көбүрөөк жана көбүрөөк коэффициенттер жүктөлгөн сайын деталдуураак болот.

Бул жерде, жөн гана көңүл ачуу үчүн, сиз болгону 24 000 номерди колдоно аласыз:

JPEG форматы кантип иштейт

Же жөн эле 5000:

JPEG форматы кантип иштейт

Абдан бүдөмүк, бирок кандайдыр бир жол менен таанылат!

3. Run узундугу коддоо, Delta жана Huffman

Буга чейин, кысуу бардык этаптары жоготуу болуп саналат. Акыркы этап, тескерисинче, жоготуусуз уланат. Ал маалыматты жок кылбайт, бирок файлдын көлөмүн кыйла азайтат.

Маалыматты ыргытпастан кантип бир нерсени кысууга болот? 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 мааниси деп аталат жана ар бир DC мааниси мурункуларга карата дельта коддолгон. Ошондуктан, биринчи блоктун жарыктыгын өзгөртүү бардык блокторго таасирин тийгизет.

Акыркы табышмак бойдон калууда: сингулярды өзгөртүү кантип бүт сүрөттү толугу менен бузат? Буга чейин кысуу деңгээли мындай касиеттерге ээ болгон эмес. Жооп JPEG аталышында. Биринчи 500 байт сүрөт жөнүндө метаберилиштерди камтыйт - туурасы, бийиктиги ж.б., жана биз алар менен иштей элекпиз.

Баш аты жок JPEG коддорун чечмелөө дээрлик мүмкүн эмес (же өтө кыйын). Сүрөттү сизге сүрөттөп берейин дегендей көрүнөт, таасиримди жеткирүү үчүн сөздү ойлоп таба баштадым. Сүрөттөмө, кыязы, бир топ кыскараак болот, анткени мен айткым келген маанидеги сөздөрдү ойлоп таба алам, бирок башкалар үчүн алардын мааниси жок.

Бул акылсыз угулат, бирок дал ушундай болот. Ар бир JPEG сүрөтү ага тиешелүү коддор менен кысылган. Код сөздүгү аталышта сакталат. Бул ыкма Хаффман коду жана лексика Хаффман таблицасы деп аталат. Башында таблица эки байт менен белгиленет - 255, андан кийин 196. Ар бир түстүү компоненттин өзүнүн таблицасы болушу мүмкүн.

Таблицаларга өзгөртүүлөр түп-тамырынан бери кандайдыр бир сүрөткө таасирин тийгизет. Жакшы мисал - 15-сапты 1ге өзгөртүү.

JPEG форматы кантип иштейт

Бул таблицаларда жеке биттердин кандайча окулушу керектиги көрсөтүлгөндүктөн болот. Буга чейин биз ондук формадагы экилик сандар менен гана иштедик. Бирок бул бизден жашырат, эгер сиз 1 санын байтта сактагыңыз келсе, ал 00000001ге окшош болот, анткени ар бир байт туура сегиз битке ээ болушу керек, ал тургай алардын бирөө гана керек.

Эгер сизде кичинекей сандар көп болсо, бул мейкиндиктин чоң ысырап болушу мүмкүн. Хаффман коду - бул ар бир сан сегиз бит ээлеши керек деген талапты жеңилдетүүгө мүмкүндүк берген ыкма. Бул эки байтты көрсөңүз:

234 115

Андан кийин, Хаффман таблицасына жараша, бул үч сан болушу мүмкүн. Аларды чыгаруу үчүн, адегенде аларды жеке биттерге бөлүү керек:

11101010 01110011

Анан аларды кантип топтош керек экенин таблицага карайбыз. Мисалы, бул биринчи алты бит (111010) же ондук сандагы 58, андан кийин беш бит (10011) же 19, акырында акыркы төрт бит (0011) же 3 болушу мүмкүн.

Ошондуктан, бул кысуу этабында байттарды түшүнүү абдан кыйын. Байттар алар көрүнгөн нерсени билдирбейт. Мен бул макалада үстөл менен иштөө боюнча майда-чүйдөсүнө чейин барбайм, бирок материалдар бул маселе боюнча онлайн жетишет.

Бул билим менен кыла турган кызыктуу амалдардын бири - башты JPEGден бөлүп, өзүнчө сактоо. Чынында, файлды сиз гана окуй аласыз. Facebook муну файлдарды дагы кичирейтүү үчүн жасайт.

Дагы эмне кылса болот, Huffman таблицасын бир аз өзгөртүү. Башкалар үчүн ал сынган сүрөт сыяктуу көрүнөт. Жана аны оңдоонун сыйкырдуу жолун сиз гана билесиз.

Жыйынтыктап көрөлү: JPEG коддон чыгуу үчүн эмне керек? Керектүү:

  1. Хаффман таблицасын(-ларын) баш маалыматтан чыгарып, биттерди чечмелеңиз.
  2. Ар бир 8x8 блок үчүн ар бир түс жана жарыктык компоненти үчүн дискреттик косинус трансформация коэффициенттерин чыгарып, тескери узундуктагы жана дельтаны коддоо трансформацияларын аткарыңыз.
  3. Ар бир 8x8 блок үчүн пикселдик маанилерди алуу үчүн коэффициенттердин негизинде косинустарды бириктириңиз.
  4. Эгерде кошумча үлгү алуу аткарылса, түс компоненттерин масштабдаңыз (бул маалымат башта).
  5. Ар бир пиксел үчүн алынган YCbCr маанилерин RGBге айландырыңыз.
  6. Сүрөттү экранга чыгарыңыз!

Жөн эле мышык менен сүрөттү көрүү үчүн олуттуу иш! Бирок, мага жаккан нерсе, бул JPEG технологиясы канчалык адамга багытталгандыгын көрсөтүп турат. Бул кадимки технологияларга караганда бир топ жакшыраак кысууга жетишүүгө мүмкүндүк берүүчү биздин кабылдообуздун өзгөчөлүктөрүнө негизделген. Эми биз JPEG кантип иштээрин түшүнгөндөн кийин, биз бул технологияларды башка аймактарга кантип которууга болорун элестете алабыз. Мисалы, видеодо дельтаны коддоо файлдын көлөмүн олуттуу кыскартууну камсыздай алат, анткени көбүнчө кадрдан кадрга өзгөрбөгөн бүтүндөй аймактар ​​бар (мисалы, фон).

Макалада колдонулган код, ачык жана сүрөттөрдү өзүңүздүкү сүрөткө алмаштыруу боюнча нускамаларды камтыйт.

Source: www.habr.com

Комментарий кошуу