{"id":307331,"date":"2020-07-22T15:01:03","date_gmt":"2020-07-22T15:01:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=307331"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2020-07-22T15:01:03","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=307331","title":{"rendered":"\u0414\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c JPEG-\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Python"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/512004\/\">\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/9p\/8u\/z0\/9p8uz00vyiu_gcooou6mjpi6tcg.jpeg\" width=\"400\"><\/div>\n<p>  \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442, \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u0441\u0436\u0430\u0442\u0438\u044f JPEG. \u041c\u043d\u043e\u0433\u0438\u0435 \u043d\u0435 \u0437\u043d\u0430\u044e\u0442, \u0447\u0442\u043e JPEG \u2014 \u044d\u0442\u043e \u043d\u0435 \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0444\u043e\u0440\u043c\u0430\u0442, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e JPEG-\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 JFIF (JPEG File Interchange Format), \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u0436\u0430\u0442\u0438\u044f JPEG. \u041a \u043a\u043e\u043d\u0446\u0443 \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u043a\u0430\u043a \u044d\u0442\u043e\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u0436\u0438\u043c\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043a\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0438 \u043d\u0430 Python. \u041c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043d\u044e\u0430\u043d\u0441\u044b \u0444\u043e\u0440\u043c\u0430\u0442\u0430 JPEG (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u043e\u0435 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435), \u0430 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u0430, \u043f\u043e\u043a\u0430 \u0431\u0443\u0434\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0434\u0435\u043a\u043e\u0434\u0435\u0440.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>  \u0417\u0430\u0447\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u043d\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u043f\u0440\u043e JPEG, \u043a\u043e\u0433\u0434\u0430 \u043e\u0431 \u044d\u0442\u043e\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0443\u0436\u0435 \u0441\u043e\u0442\u043d\u0438 \u0441\u0442\u0430\u0442\u0435\u0439? \u041e\u0431\u044b\u0447\u043d\u043e \u0432 \u0442\u0430\u043a\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445 \u0430\u0432\u0442\u043e\u0440\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043b\u0438\u0448\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0441\u043e\u0431\u043e\u0439 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0430\u0442. \u0412\u044b \u043d\u0435 \u043f\u0438\u0448\u0435\u0442\u0435 \u043a\u043e\u0434 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0438 \u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0410 \u0435\u0441\u043b\u0438 \u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u0442\u0435 \u0447\u0442\u043e-\u0442\u043e, \u0442\u043e \u043d\u0430 \u0421\/\u0421++, \u0438 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0448\u0438\u0440\u043e\u043a\u043e\u043c\u0443 \u043a\u0440\u0443\u0433\u0443 \u043b\u044e\u0434\u0435\u0439. \u042f \u0445\u043e\u0447\u0443 \u043d\u0430\u0440\u0443\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u044e \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0430\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Python 3, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0434\u0435\u043a\u043e\u0434\u0435\u0440 JPEG. \u0412 \u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u0435 \u0431\u0443\u0434\u0435\u0442 <a href=\"https:\/\/github.com\/aguaviva\/micro-jpeg-visualizer\/blob\/master\/micro-jpeg-visualizer.py\">\u044d\u0442\u043e\u0442<\/a> \u043a\u043e\u0434, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 MIT, \u043d\u043e \u044f \u0435\u0433\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u044e \u0440\u0430\u0434\u0438 \u0443\u0434\u043e\u0431\u043e\u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0441\u0442\u0438 \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0441\u0442\u0438. \u0418\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u0439 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043a\u043e\u0434 \u0432\u044b \u043d\u0430\u0439\u0434\u0451\u0442\u0435 \u0432 \u043c\u043e\u0451\u043c <a href=\"https:\/\/github.com\/yasoob\/Baseline-JPEG-Decoder\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a>.<\/p>\n<h2>\u0420\u0430\u0437\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u0438 JPEG<\/h2>\n<p>  \u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438, \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u043e\u0439 <a href=\"https:\/\/twitter.com\/angealbertini\">Ange Albertini<\/a>. \u041d\u0430 \u043d\u0435\u0439 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u044b \u0432\u0441\u0435 \u0447\u0430\u0441\u0442\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e JPEG-\u0444\u0430\u0439\u043b\u0430. \u041c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0435\u0433\u043c\u0435\u043d\u0442, \u0438 \u043f\u043e \u043c\u0435\u0440\u0435 \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u044b \u043d\u0435 \u0440\u0430\u0437 \u0431\u0443\u0434\u0435\u0442\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u044d\u0442\u043e\u0439 \u0438\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u0438.<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/18e\/f39\/43a\/18ef3943a55bb7c22050cc1928de2273.png\"><\/div>\n<p>  \u041f\u043e\u0447\u0442\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 (\u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432). \u041c\u043e\u0436\u0435\u0442\u0435 \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0438\u0445 \u0441\u0432\u043e\u0435\u0433\u043e \u0440\u043e\u0434\u0430 \u0437\u0430\u043a\u043b\u0430\u0434\u043a\u0430\u043c\u0438. \u041e\u043d\u0438 \u043a\u0440\u0430\u0439\u043d\u0435 \u0432\u0430\u0436\u043d\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0444\u0430\u0439\u043b\u043e\u043c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0442\u0430\u043a\u0438\u043c\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u043c\u0438 \u043a\u0430\u043a file (\u043d\u0430 Mac \u0438 Linux), \u0447\u0442\u043e\u0431\u044b \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0443\u0437\u043d\u0430\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043e \u0444\u0430\u0439\u043b\u0435. \u041c\u0430\u0440\u043a\u0435\u0440\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442, \u0433\u0434\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0432 \u0444\u0430\u0439\u043b\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043c\u0430\u0440\u043a\u0435\u0440\u044b \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u0438\u043d\u044b (<code>length<\/code>) \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430.<\/p>\n<h3>\u041d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446 \u0444\u0430\u0439\u043b\u0430<\/h3>\n<p>  \u0421\u0430\u043c\u044b\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0430\u0436\u043d\u044b\u0439 \u0434\u043b\u044f \u043d\u0430\u0441 \u043c\u0430\u0440\u043a\u0435\u0440 \u2014 <code>FF D8<\/code>. \u041e\u043d \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043d\u0430\u0447\u0430\u043b\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u043c\u044b \u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u043c, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u043c\u0430\u0440\u043a\u0435\u0440 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u0430\u043a\u043e\u043c-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u043c \u0444\u0430\u0439\u043b\u0435. \u041d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0432\u0430\u0436\u0435\u043d \u0438 \u043c\u0430\u0440\u043a\u0435\u0440 <code>FF D9<\/code>. \u041e\u043d \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u0434\u043e\u0448\u043b\u0438 \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0444\u0430\u0439\u043b\u0430 \u0441 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c. \u041f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043c\u0430\u0440\u043a\u0435\u0440\u0430, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 <code>FFD0<\/code> \u2014 <code>FFD9<\/code> \u0438 <code>FF01<\/code>, \u0441\u0440\u0430\u0437\u0443 \u0438\u0434\u0451\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u0438\u043d\u044b \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430 \u044d\u0442\u043e\u0433\u043e \u043c\u0430\u0440\u043a\u0435\u0440\u0430. \u0410 \u043c\u0430\u0440\u043a\u0435\u0440\u044b \u043d\u0430\u0447\u0430\u043b\u0430 \u0438 \u043a\u043e\u043d\u0446\u0430 \u0444\u0430\u0439\u043b\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u043e\u0439 \u0434\u0432\u0430 \u0431\u0430\u0439\u0442\u0430 \u043a\u0430\u0436\u0434\u044b\u0439.<\/p>\n<p>  \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u044d\u0442\u0438\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/ff2\/4bc\/798\/ff24bc798e9f4f84d07b99d7a8a94b69.jpg\"><\/div>\n<p>  \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043a\u043e\u0434 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 \u043d\u0430\u0447\u0430\u043b\u0430 \u0438 \u043a\u043e\u043d\u0446\u0430 \u0444\u0430\u0439\u043b\u0430.<\/p>\n<pre><code class=\"plaintext\">from struct import unpack  marker_mapping = {     0xffd8: &quot;Start of Image&quot;,     0xffe0: &quot;Application Default Header&quot;,     0xffdb: &quot;Quantization Table&quot;,     0xffc0: &quot;Start of Frame&quot;,     0xffc4: &quot;Define Huffman Table&quot;,     0xffda: &quot;Start of Scan&quot;,     0xffd9: &quot;End of Image&quot; }  class JPEG:     def __init__(self, image_file):         with open(image_file, 'rb') as f:             self.img_data = f.read()          def decode(self):         data = self.img_data         while(True):             marker, = unpack(&quot;&gt;H&quot;, data[0:2])             print(marker_mapping.get(marker))             if marker == 0xffd8:                 data = data[2:]             elif marker == 0xffd9:                 return             elif marker == 0xffda:                 data = data[-2:]             else:                 lenchunk, = unpack(&quot;&gt;H&quot;, data[2:4])                 data = data[2+lenchunk:]                         if len(data)==0:                 break          if __name__ == &quot;__main__&quot;:     img = JPEG('profile.jpg')     img.decode()      # OUTPUT: # Start of Image # Application Default Header # Quantization Table # Quantization Table # Start of Frame # Huffman Table # Huffman Table # Huffman Table # Huffman Table # Start of Scan # End of Image <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0438 \u0431\u0430\u0439\u0442\u043e\u0432 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 <a href=\"https:\/\/docs.python.org\/3\/library\/struct.html\">struct<\/a>. <code>&gt;H<\/code> \u0433\u043e\u0432\u043e\u0440\u0438\u0442 <code>struct<\/code>, \u0447\u0442\u043e\u0431\u044b \u0442\u0430 \u0441\u0447\u0438\u0442\u0430\u043b\u0430 \u0442\u0438\u043f \u0434\u0430\u043d\u043d\u044b\u0445 <code>unsigned short<\/code> \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u0441 \u043d\u0438\u043c\u0438 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043e\u0442 \u0441\u0442\u0430\u0440\u0448\u0435\u0433\u043e \u043a \u043c\u043b\u0430\u0434\u0448\u0435\u043c\u0443 (big-endian). \u0414\u0430\u043d\u043d\u044b\u0435 \u0432 JPEG \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u043e\u0442 \u0441\u0442\u0430\u0440\u0448\u0435\u0433\u043e \u043a \u043c\u043b\u0430\u0434\u0448\u0435\u043c\u0443. \u0422\u043e\u043b\u044c\u043a\u043e EXIF-\u0434\u0430\u043d\u043d\u044b\u0435 <i>\u043c\u043e\u0433\u0443\u0442<\/i> \u0431\u044b\u0442\u044c \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u043e\u0442 \u043c\u043b\u0430\u0434\u0448\u0435\u0433\u043e \u043a \u0441\u0442\u0430\u0440\u0448\u0435\u043c\u0443 (little-endian) (\u0445\u043e\u0442\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a). \u0410 \u0440\u0430\u0437\u043c\u0435\u0440 <code>short<\/code> \u0440\u0430\u0432\u0435\u043d 2, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c <code>unpack<\/code> \u0434\u0432\u0430 \u0431\u0430\u0439\u0442\u0430 \u0438\u0437 <code>img_data<\/code>. \u041a\u0430\u043a \u043c\u044b \u0443\u0437\u043d\u0430\u043b\u0438, \u0447\u0442\u043e \u044d\u0442\u043e <code>short<\/code>? \u041c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u043c\u0430\u0440\u043a\u0435\u0440\u044b \u0432 JPEG \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0442\u044b\u0440\u044c\u043c\u044f \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u044b\u043c\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438: <code>ffd8<\/code>. \u041e\u0434\u0438\u043d \u0442\u0430\u043a\u043e\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u0435\u043d \u0447\u0435\u0442\u044b\u0440\u0451\u043c \u0431\u0438\u0442\u0430\u043c(\u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0435 \u0431\u0430\u0439\u0442\u0430), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0447\u0435\u0442\u044b\u0440\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u0431\u0443\u0434\u0443\u0442 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u044b \u0434\u0432\u0443\u043c \u0431\u0430\u0439\u0442\u0430\u043c, \u043a\u0430\u043a \u0438 <code>short<\/code>.<\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0430 Start of Scan \u0441\u0440\u0430\u0437\u0443 \u0438\u0434\u0443\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b. \u041e\u043d\u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0442\u0441\u044f \u0434\u043e \u043c\u0430\u0440\u043a\u0435\u0440\u0430 \u00ab\u043a\u043e\u043d\u0435\u0446 \u0444\u0430\u0439\u043b\u0430\u00bb, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u043e\u043a\u0430 \u043c\u044b \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u00ab\u0438\u0449\u0435\u043c\u00bb \u0435\u0433\u043e, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043c\u0430\u0440\u043a\u0435\u0440 Start of Scan.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f \u0441 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0437\u0443\u0447\u0438\u043c \u0442\u0435\u043e\u0440\u0438\u044e, \u0430 \u043f\u043e\u0442\u043e\u043c \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e.<\/p>\n<h2>\u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 JPEG<\/h2>\n<p>  \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f\u0445 \u0438 \u043c\u0435\u0442\u043e\u0434\u0438\u043a\u0430\u0445 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 JPEG. \u0410 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435. \u041f\u043e \u043c\u043e\u0435\u043c\u0443 \u043e\u043f\u044b\u0442\u0443, \u0431\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0442\u0440\u0443\u0434\u043d\u043e.<\/p>\n<p>  \u0418\u043b\u043b\u044e\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043d\u0438\u0436\u0435 \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u0434\u043b\u044f \u0432\u0430\u0441 \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043e\u0434\u043d\u0430\u043a\u043e \u044f \u0431\u0443\u0434\u0443 \u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0430\u043c \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043f\u043e \u043c\u0435\u0440\u0435 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0417\u0434\u0435\u0441\u044c \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u044d\u0442\u0430\u043f\u044b JPEG-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (<a href=\"https:\/\/users.cs.cf.ac.uk\/Dave.Marshall\/Multimedia\/node234.html\">\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a<\/a>):<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/d82\/daf\/f82\/d82daff82c9e74dcf2bb2db2266cdc8c.png\"><\/div>\n<p>  <\/p>\n<h3>\u0426\u0432\u0435\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e JPEG<\/h3>\n<p>  \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 JPEG (<a href=\"http:\/\/www.itu.int\/rec\/T-REC-T.872-201206-I\/en\">ISO\/IEC 10918-6:2013 (E)<\/a>, \u0440\u0430\u0437\u0434\u0435\u043b 6.1):<\/p>\n<ul>\n<li>\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043e\u0434\u043d\u0438\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u043c, \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u0433\u0440\u0430\u0434\u0430\u0446\u0438\u044f\u0445 \u0441\u0435\u0440\u043e\u0433\u043e, \u0433\u0434\u0435 0 \u2014 \u044d\u0442\u043e \u0447\u0451\u0440\u043d\u044b\u0439, \u0430 255 \u2014 \u0431\u0435\u043b\u044b\u0439.<\/li>\n<li>\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441 \u0442\u0440\u0435\u043c\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438, \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f RGB-\u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0435 YCbCr. \u0415\u0441\u043b\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0435\u0433\u043c\u0435\u043d\u0442 \u043c\u0430\u0440\u043a\u0435\u0440\u0430 APP14, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 6.5.3, \u0442\u043e \u0446\u0432\u0435\u0442\u043e\u0432\u0430\u044f \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f RGB \u0438\u043b\u0438 YCbCr \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u0432 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0435 \u043c\u0430\u0440\u043a\u0435\u0440\u0430 APP14. \u0421\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 RGB \u0438 YCbCr \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c\u0438 ITU-T T.871 | ISO\/IEC 10918-5.<\/li>\n<li>\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441 \u0447\u0435\u0442\u044b\u0440\u044c\u043c\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438, \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f <strong>CMYK<\/strong>-\u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0433\u0434\u0435 (0,0,0,0) \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0431\u0435\u043b\u044b\u0439 \u0446\u0432\u0435\u0442. \u0415\u0441\u043b\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0435\u0433\u043c\u0435\u043d\u0442 \u043c\u0430\u0440\u043a\u0435\u0440\u0430 APP14, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 6.5.3, \u0442\u043e \u0446\u0432\u0435\u0442\u043e\u0432\u0430\u044f \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f <strong>CMYK<\/strong> \u0438\u043b\u0438 <strong>YCCK<\/strong> \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u0432 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0435 \u043c\u0430\u0440\u043a\u0435\u0440\u0430 APP14. \u0421\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 <strong>CMYK<\/strong> \u0438 <strong>YCCK<\/strong> \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u043f\u0443\u043d\u043a\u0442\u0435 7.<\/li>\n<\/ul>\n<p>  \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 JPEG \u0432\u043c\u0435\u0441\u0442\u043e RGB \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u044f\u0440\u043a\u043e\u0441\u0442\u044c (luminance) \u0438 \u0445\u0440\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c (chrominance) (\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 YUV). \u042d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u0438\u0439 \u0433\u043b\u0430\u0437 \u043e\u0447\u0435\u043d\u044c \u043f\u043b\u043e\u0445\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0435\u0442 \u0432\u044b\u0441\u043e\u043a\u043e\u0447\u0430\u0441\u0442\u043e\u0442\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u044f\u0440\u043a\u043e\u0441\u0442\u0438 \u043d\u0430 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u0443\u0447\u0430\u0441\u0442\u043a\u0430\u0445, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u0447\u0430\u0441\u0442\u043e\u0442\u0443, \u0438 \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u043d\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u0442 \u0440\u0430\u0437\u043d\u0438\u0446\u044b. \u0427\u0442\u043e \u044d\u0442\u043e \u0434\u0430\u0451\u0442? \u0421\u0438\u043b\u044c\u043d\u043e \u0441\u0436\u0430\u0442\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435\u0437\u0430\u043c\u0435\u0442\u043d\u044b\u043c \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435\u043c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430.<\/p>\n<p>  \u041a\u0430\u043a \u0432 RGB \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0442\u0440\u0435\u043c\u044f \u0431\u0430\u0439\u0442\u0430\u043c\u0438 \u0446\u0432\u0435\u0442\u043e\u0432 (\u043a\u0440\u0430\u0441\u043d\u043e\u0433\u043e, \u0437\u0435\u043b\u0451\u043d\u043e\u0433\u043e \u0438 \u0441\u0438\u043d\u0435\u0433\u043e), \u0442\u0430\u043a \u0438 \u0432 YUV \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0442\u0440\u0438 \u0431\u0430\u0439\u0442\u0430, \u043e\u0434\u043d\u0430\u043a\u043e \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u0440\u0443\u0433\u043e\u0435. \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 Y \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u044f\u0440\u043a\u043e\u0441\u0442\u044c \u0446\u0432\u0435\u0442\u0430 (luminance, \u0438\u043b\u0438 luma). U \u0438 V \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u0446\u0432\u0435\u0442 (chroma): U \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0434\u043e\u043b\u044e \u0441\u0438\u043d\u0435\u0433\u043e \u0446\u0432\u0435\u0442\u0430, \u0430 V \u2014 \u0437\u0430 \u0434\u043e\u043b\u044e \u043a\u0440\u0430\u0441\u043d\u043e\u0433\u043e.<\/p>\n<p>  \u042d\u0442\u043e\u0442 \u0444\u043e\u0440\u043c\u0430\u0442 \u0431\u044b\u043b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u0432 \u0442\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0430, \u043a\u043e\u0433\u0434\u0430 \u0442\u0435\u043b\u0435\u0432\u0438\u0434\u0435\u043d\u0438\u0435 \u0435\u0449\u0451 \u043d\u0435 \u0431\u044b\u043b\u043e \u0441\u0442\u043e\u043b\u044c \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u043c, \u0438 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0444\u043e\u0440\u043c\u0430\u0442 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u0434\u043b\u044f \u0446\u0432\u0435\u0442\u043d\u043e\u0433\u043e, \u0438 \u0434\u043b\u044f \u0447\u0451\u0440\u043d\u043e-\u0431\u0435\u043b\u043e\u0433\u043e \u0442\u0435\u043b\u0435\u0432\u0435\u0449\u0430\u043d\u0438\u044f. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u0447\u0438\u0442\u0430\u0439\u0442\u0435 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/YUV\">\u0442\u0443\u0442<\/a>.<\/p>\n<h3>\u0414\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u043e\u0435 \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0438\u0435<\/h3>\n<p>  JPEG \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u0431\u043b\u043e\u043a\u0438 8&#215;8 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 (\u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f MCU, Minimum Coding Unit \u2014 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0435\u0434\u0438\u043d\u0438\u0446\u044b \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f), \u043c\u0435\u043d\u044f\u0435\u0442 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0432 \u0446\u0435\u043d\u0442\u0440\u0435 \u0431\u044b\u043b\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 0, \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0431\u043b\u043e\u043a\u0443 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u043e\u0435 \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0441\u0436\u0438\u043c\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0438\u044f. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u043c\u0441\u044f, \u0447\u0442\u043e \u0432\u0441\u0451 \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442. <\/p>\n<p>  \u0414\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u043e\u0435 \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 (\u0414\u041a\u041f) \u2014 \u044d\u0442\u043e \u043c\u0435\u0442\u043e\u0434 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0439 \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u044b\u0445 \u0432\u043e\u043b\u043d. \u041f\u0440\u0435\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0432 \u043d\u0430\u0431\u043e\u0440 \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043e\u0432 \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c \u0437\u0430\u043d\u044f\u0442\u0438\u0435\u043c, \u043d\u043e \u0432\u044b \u043f\u043e\u0439\u043c\u0451\u0442\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u0443, \u043a\u043e\u0433\u0434\u0430 \u0443\u0437\u043d\u0430\u0435\u0442\u0435 \u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u044d\u0442\u0430\u043f\u0430\u0445. \u0414\u041a\u041f \u0431\u0435\u0440\u0451\u0442 \u0431\u043b\u043e\u043a 8\u04458 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043d\u0430\u043c, \u043a\u0430\u043a \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u044d\u0442\u043e\u0442 \u0431\u043b\u043e\u043a \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0438\u0437 8\u04458 \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439. <a href=\"https:\/\/www.impulseadventure.com\/photo\/jpeg-minimum-coded-unit.html\">\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0442\u0443\u0442<\/a>.<\/p>\n<p>  \u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/4e0\/a50\/e3e\/4e0a50e3e9c53e6eefd6ee62bee06eb1.png\"><\/div>\n<p>  \u041c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0414\u041a\u041f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043a \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 \u043f\u0438\u043a\u0441\u0435\u043b\u044f. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u043e\u0432 8\u04458, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u043a\u043b\u0430\u0434 \u043a\u0430\u0436\u0434\u043e\u0439 (\u0438\u0437 \u0432\u0441\u0435\u0445 64) \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u0435 8\u04458. \u0412 \u043c\u0430\u0442\u0440\u0438\u0446\u0435 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u043e\u0432 \u0414\u041a\u041f \u0441\u0430\u043c\u044b\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0443\u0433\u043b\u0443, \u0430 \u0441\u0430\u043c\u044b\u0435 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u2014 \u0432 \u043f\u0440\u0430\u0432\u043e\u043c \u043d\u0438\u0436\u043d\u0435\u043c. \u041b\u0435\u0432\u044b\u0439 \u0432\u0435\u0440\u0445\u043d\u0438\u0439 \u0443\u0433\u043e\u043b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u0430\u043c\u0443\u044e \u043d\u0438\u0437\u043a\u043e\u0447\u0430\u0441\u0442\u043e\u0442\u043d\u0443\u044e \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0430 \u043f\u0440\u0430\u0432\u044b\u0439 \u043d\u0438\u0436\u043d\u0438\u0439 \u2014 \u0441\u0430\u043c\u0443\u044e \u0432\u044b\u0441\u043e\u043a\u043e\u0447\u0430\u0441\u0442\u043e\u0442\u043d\u0443\u044e.<\/p>\n<p>  \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0435\u0441\u0442\u044c \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u0438\u0437\u043a\u043e\u0447\u0430\u0441\u0442\u043e\u0442\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0438 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0434\u043e\u043b\u044f \u0432\u044b\u0441\u043e\u043a\u043e\u0447\u0430\u0441\u0442\u043e\u0442\u043d\u043e\u0439. \u0415\u0441\u043b\u0438 \u043f\u0440\u0430\u0432\u044b\u043c \u043d\u0438\u0436\u043d\u0438\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c \u043a\u0430\u0436\u0434\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0414\u041a\u041f \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 0, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u0435\u0441\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a \u0436\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u043f\u043b\u043e\u0445\u043e \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0435\u0442 \u0432\u044b\u0441\u043e\u043a\u043e\u0447\u0430\u0441\u0442\u043e\u0442\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u042d\u0442\u043e \u043c\u044b \u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u044d\u0442\u0430\u043f\u0435.<\/p>\n<p>  \u042f \u043d\u0430\u0448\u0451\u043b \u043e\u0442\u043b\u0438\u0447\u043d\u043e\u0435 \u0432\u0438\u0434\u0435\u043e \u043f\u043e \u044d\u0442\u043e\u0439 \u0442\u0435\u043c\u0435. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435 \u0441\u043c\u044b\u0441\u043b\u0430 \u0414\u041a\u041f:<\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.25%;\"><iframe src=\"https:\/\/www.youtube.com\/embed\/Q2aEzeMDHMA?rel=0&amp;showinfo=1&amp;hl=en-US\" style=\"border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;\" allowfullscreen scrolling=\"no\" allow=\"encrypted-media; accelerometer; gyroscope; picture-in-picture\"><\/iframe><\/div>\n<\/div>\n<\/div>\n<p>  \u0412\u0441\u0435 \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e JPEG \u2014 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u0436\u0430\u0442\u0438\u044f \u0441 \u043f\u043e\u0442\u0435\u0440\u044f\u043c\u0438. \u041d\u043e \u043f\u043e\u043a\u0430 \u0447\u0442\u043e \u043c\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u043b\u0438. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u043b\u043e\u043a\u0438 8\u04458 YUV-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0432 \u0431\u043b\u043e\u043a\u0438 8\u04458 \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0431\u0435\u0437 \u043f\u043e\u0442\u0435\u0440\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438. \u042d\u0442\u0430\u043f \u043f\u043e\u0442\u0435\u0440\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u2014 \u044d\u0442\u043e \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0438\u0435.<\/p>\n<p>  \u041a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0431\u0435\u0440\u0451\u043c \u0434\u0432\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u0438 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0438\u0445 \u0432 \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u043b\u0438\u0448\u044c \u0445\u0438\u0442\u0440\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043a 0 \u0441\u0430\u043c\u044b\u0445 \u0432\u044b\u0441\u043e\u043a\u043e\u0447\u0430\u0441\u0442\u043e\u0442\u043d\u044b\u0445 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u043e\u0432 \u0432 \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u0439\u0441\u044f \u0414\u041a\u041f-\u043c\u0430\u0442\u0440\u0438\u0446\u0435. \u041f\u0440\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e JPEG \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u043e\u0432 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0442, \u043a\u0430\u043a\u043e\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0441\u0436\u0430\u0442\u0438\u044f \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u0430\u0434\u0430\u0442\u044c. \u0417\u0434\u0435\u0441\u044c \u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0442\u0435\u0440\u044f \u0432\u044b\u0441\u043e\u043a\u043e\u0447\u0430\u0441\u0442\u043e\u0442\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438. \u0412\u044b \u0443\u0436\u0435 \u043d\u0435 \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u043e\u0441\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0438\u0437 \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u0433\u043e\u0441\u044f JPEG-\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0441\u0436\u0430\u0442\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u044b\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0438\u044f (\u0437\u0430\u0431\u0430\u0432\u043d\u044b\u0439 \u0444\u0430\u043a\u0442: \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438\u043c\u0435\u044e\u0442 \u043f\u0430\u0442\u0435\u043d\u0442\u044b \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0438\u044f). \u041c\u044b \u043f\u043e\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043d\u043e \u0434\u0435\u043b\u0438\u043c \u0414\u041a\u041f-\u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0438\u044f, \u043e\u043a\u0440\u0443\u0433\u043b\u044f\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0434\u043e \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043c\u0430\u0442\u0440\u0438\u0446\u0443. <\/p>\n<p>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440. \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0430\u044f \u0414\u041a\u041f-\u043c\u0430\u0442\u0440\u0438\u0446\u0430:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/582\/67c\/31b\/58267c31b02544609958d4f8490372ea.png\"><\/div>\n<p>  \u0410 \u0432\u043e\u0442 \u043e\u0431\u044b\u0447\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/1c2\/693\/6a2\/1c26936a28dd7f96f23b6137f14526b7.png\"><\/div>\n<p>  \u041a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/e71\/2c5\/08f\/e712c508fea84ade5eb324ab6ebce39d.png\"><\/div>\n<p>  \u0425\u043e\u0442\u044f \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u0438 \u043d\u0435 \u0432\u0438\u0434\u0438\u0442 \u0432\u044b\u0441\u043e\u043a\u043e\u0447\u0430\u0441\u0442\u043e\u0442\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0435\u0441\u043b\u0438 \u0432\u044b \u0443\u0434\u0430\u043b\u0438\u0442\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0431\u043b\u043e\u043a\u043e\u0432 8\u04458 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0433\u0440\u0443\u0431\u043e. \u0412 \u0442\u0430\u043a\u043e\u0439 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u0435 \u0441\u0430\u043c\u043e\u0435 \u043f\u0435\u0440\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f DC-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c, \u0430 \u0432\u0441\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u2014 AC-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438. \u0415\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u0432\u0437\u044f\u043b\u0438 DC-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043c\u0430\u0442\u0440\u0438\u0446 \u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043d\u043e\u0432\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0431\u044b \u043f\u0440\u0435\u0432\u044c\u044e\u0448\u043a\u0443 \u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0432 8 \u0440\u0430\u0437 \u043c\u0435\u043d\u044c\u0448\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u0445\u043e\u0447\u0443 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u043b\u0438 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0438\u0435, \u043d\u0443\u0436\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0446\u0432\u0435\u0442\u0430 \u043f\u043e\u043f\u0430\u0434\u0430\u044e\u0442 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [0,255]. \u0415\u0441\u043b\u0438 \u043e\u043d\u0438 \u0438\u0437 \u043d\u0435\u0433\u043e \u0432\u044b\u043b\u0435\u0442\u0430\u044e\u0442, \u0442\u043e \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u0438\u0445 \u043a \u044d\u0442\u043e\u043c\u0443 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0443.<\/p>\n<h3>\u0417\u0438\u0433\u0437\u0430\u0433<\/h3>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c JPEG \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0437\u0438\u0433\u0437\u0430\u0433-\u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043a \u043e\u0434\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u043c\u0443 \u0432\u0438\u0434\u0443:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/35f\/8d4\/67d\/35f8d467d6425996b4d97a38085340b2.jpg\"><\/div>\n<p>  <a href=\"https:\/\/people.ece.cornell.edu\/land\/courses\/ece5760\/FinalProjects\/f2009\/jl589_jbw48\/jl589_jbw48\/index.html\"><i>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a<\/i><\/a>.<\/p>\n<p>  \u041f\u0443\u0441\u0442\u044c \u0443 \u043d\u0430\u0441 \u0442\u0430\u043a\u0430\u044f \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/57f\/343\/e23\/57f343e2303db31f8c6b2f7f0cafb660.png\"><\/div>\n<p>  \u0422\u043e\u0433\u0434\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0437\u0438\u0433\u0437\u0430\u0433-\u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u0438\u043c:<\/p>\n<pre><code class=\"plaintext\">[15 14 13 12 11 10 9 8 0  ...  0] <\/code><\/pre>\n<p>  \u042d\u0442\u043e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043d\u0438\u0437\u043a\u043e\u0447\u0430\u0441\u0442\u043e\u0442\u043d\u043e\u0439 (\u0441\u0430\u043c\u043e\u0439 \u0432\u0430\u0436\u043d\u043e\u0439) \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043e \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b, \u0430 \u0437\u0438\u0433\u0437\u0430\u0433-\u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043e\u0434\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u044b. \u042d\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u044d\u0442\u0430\u043f\u0430 \u2014 \u0441\u0436\u0430\u0442\u0438\u044f.<\/p>\n<h3>\u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u0438\u043d \u0441\u0435\u0440\u0438\u0439 \u0438 \u0434\u0435\u043b\u044c\u0442\u0430-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/h3>\n<p>  \u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u0438\u043d \u0441\u0435\u0440\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u0436\u0430\u0442\u0438\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u043e\u0441\u043b\u0435 \u0437\u0438\u0433\u0437\u0430\u0433-\u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0432 \u043a\u043e\u043d\u0446\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043f\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u043d\u0443\u043b\u0438. \u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u0438\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0439 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0432\u043f\u0443\u0441\u0442\u0443\u044e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u043c\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435 \u0431\u0430\u0439\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u044d\u0442\u0438\u0445 \u043d\u0443\u043b\u0435\u0439. \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0443 \u043d\u0430\u0441 \u0442\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<pre><code class=\"plaintext\">10 10 10 10 10 10 10 <\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u0438\u043d \u0441\u0435\u0440\u0438\u0439 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0432\u043e\u0442 \u0447\u0442\u043e:<\/p>\n<pre><code class=\"plaintext\">7 10 <\/code><\/pre>\n<p>  \u041c\u044b \u0441\u0436\u0430\u043b\u0438 7 \u0431\u0430\u0439\u0442\u043e\u0432 \u0432 2 \u0431\u0430\u0439\u0442\u0430.<\/p>\n<p>  \u0414\u0435\u043b\u044c\u0442\u0430-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u0430\u0439\u0442\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0431\u0430\u0439\u0442\u0430 \u0434\u043e \u043d\u0435\u0433\u043e. \u041f\u0440\u043e\u0449\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435. \u041f\u0443\u0441\u0442\u044c \u0443 \u043d\u0430\u0441 \u0442\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<pre><code class=\"plaintext\">10 11 12 13 10 9 <\/code><\/pre>\n<p>  \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0435\u043b\u044c\u0442\u0430-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"plaintext\">10 1  2  3  0 -1 <\/code><\/pre>\n<p>  \u0412 JPEG \u043a\u0430\u0436\u0434\u043e\u0435 DC-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0414\u041a\u041f-\u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0435\u043b\u044c\u0442\u0430-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e DC-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0432 \u0441\u0430\u043c\u044b\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u0414\u041a\u041f-\u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432\u044b \u043f\u043e\u0440\u0443\u0448\u0438\u0442\u0435 \u0432\u0441\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443. \u041d\u043e \u0435\u0441\u043b\u0438 \u0435\u0441\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0414\u041a\u041f-\u043c\u0430\u0442\u0440\u0438\u0446\u044b, \u0442\u043e \u044d\u0442\u043e \u043f\u043e\u0432\u043b\u0438\u044f\u0435\u0442 \u043b\u0438\u0448\u044c \u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. <\/p>\n<p>  \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u043b\u0435\u0437\u0435\u043d, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u043e\u0435 DC-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u0430\u0440\u044c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u0438\u043b\u044c\u043d\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0434\u0435\u043b\u044c\u0442\u0430-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u044b \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 DC-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0431\u043b\u0438\u0436\u0435 \u043a 0, \u0447\u0442\u043e \u0443\u043b\u0443\u0447\u0448\u0430\u0435\u0442 \u0441\u0436\u0430\u0442\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0425\u0430\u0444\u0444\u043c\u0430\u043d\u0430.<\/p>\n<h3>\u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0425\u0430\u0444\u0444\u043c\u0430\u043d\u0430<\/h3>\n<p>  \u042d\u0442\u043e \u043c\u0435\u0442\u043e\u0434 \u0441\u0436\u0430\u0442\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0431\u0435\u0437 \u043f\u043e\u0442\u0435\u0440\u044c. \u041e\u0434\u043d\u0430\u0436\u0434\u044b \u0425\u0430\u0444\u0444\u043c\u0430\u043d \u0437\u0430\u0434\u0430\u043b\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c: \u00ab\u041a\u0430\u043a\u043e\u0435 \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0438\u0442\u043e\u0432 \u044f \u043c\u043e\u0433\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430?\u00bb. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d \u0444\u043e\u0440\u043c\u0430\u0442 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0442\u0435\u043a\u0441\u0442:<\/p>\n<pre><code class=\"plaintext\">a b c d e <\/code><\/pre>\n<p>  \u041e\u0431\u044b\u0447\u043d\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u0434\u0438\u043d \u0431\u0430\u0439\u0442 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430:<\/p>\n<pre><code class=\"plaintext\">a: 01100001 b: 01100010 c: 01100011 d: 01100100 e: 01100101 <\/code><\/pre>\n<p>  \u042d\u0442\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0439 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438 ASCII. \u0410 \u0435\u0441\u043b\u0438 \u043d\u0430\u043c \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435?<\/p>\n<pre><code class=\"plaintext\"># Mapping  000: 01100001 001: 01100010 010: 01100011 100: 01100100 011: 01100101 <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u0431\u0438\u0442\u043e\u0432 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0442\u043e\u0433\u043e \u0436\u0435 \u0442\u0435\u043a\u0441\u0442\u0430:<\/p>\n<pre><code class=\"plaintext\">a: 000 b: 001 c: 010 d: 100 e: 011 <\/code><\/pre>\n<p>  \u0412\u0441\u0451 \u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0435\u0449\u0451 \u0441\u0438\u043b\u044c\u043d\u0435\u0435 \u0441\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e? \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0430\u043a:<\/p>\n<pre><code class=\"plaintext\"># Mapping 0:  01100001 1:  01100010 00: 01100011 01: 01100100 10: 01100101  a: 0 b: 1 c: 00 d: 01 e: 10 <\/code><\/pre>\n<p>  \u041a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0425\u0430\u0444\u0444\u043c\u0430\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0435 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0434\u043b\u0438\u043d\u044b. \u0411\u0435\u0440\u0443\u0442\u0441\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441 \u0431\u043e\u043b\u0435\u0435 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u043c \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435\u043c \u0431\u0438\u0442\u043e\u0432, \u0430 \u043c\u0435\u043d\u0435\u0435 \u0447\u0430\u0441\u0442\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u2014 \u0441 \u0431\u043e\u043b\u0435\u0435 \u043a\u0440\u0443\u043f\u043d\u044b\u043c\u0438 \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u044f\u043c\u0438. \u0410 \u0437\u0430\u0442\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u0435\u0441\u044f \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e. \u0412 JPEG \u043c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0414\u041a\u041f-\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0425\u0430\u0444\u0444\u043c\u0430\u043d\u0430. \u041f\u043e\u043c\u043d\u0438\u0442\u0435, \u044f \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b, \u0447\u0442\u043e \u0434\u0435\u043b\u044c\u0442\u0430-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 DC-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043e\u0431\u043b\u0435\u0433\u0447\u0430\u0435\u0442 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0425\u0430\u0444\u0444\u043c\u0430\u043d\u0430? \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0432\u044b \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435, \u043f\u043e\u0447\u0435\u043c\u0443. \u041f\u043e\u0441\u043b\u0435 \u0434\u0435\u043b\u044c\u0442\u0430-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435 \u00ab\u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432\u00bb \u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u0434\u0435\u0440\u0435\u0432\u0430 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>  \u0423 \u0422\u043e\u043c\u0430 \u0421\u043a\u043e\u0442\u0442\u0430 \u0435\u0441\u0442\u044c \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e\u0435 \u0432\u0438\u0434\u0435\u043e, \u043f\u043e\u044f\u0441\u043d\u044f\u044e\u0449\u0435\u0435 \u0440\u0430\u0431\u043e\u0442\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0425\u0430\u0444\u0444\u043c\u0430\u043d\u0430. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.25%;\"><iframe src=\"https:\/\/www.youtube.com\/embed\/JsTptu56GM8?rel=0&amp;showinfo=1&amp;hl=en-US\" style=\"border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;\" allowfullscreen scrolling=\"no\" allow=\"encrypted-media; accelerometer; gyroscope; picture-in-picture\"><\/iframe><\/div>\n<\/div>\n<\/div>\n<p>  \u0412 JPEG \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0434\u043e \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u0442\u0430\u0431\u043b\u0438\u0446 \u0425\u0430\u0444\u0444\u043c\u0430\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u00abDefine Huffman Table\u00bb (\u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 <code>0xffc4<\/code>). \u0414\u041a\u041f-\u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u044b \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0434\u0432\u0443\u0445 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445 \u0425\u0430\u0444\u0444\u043c\u0430\u043d\u0430: \u0432 \u043e\u0434\u043d\u043e\u0439 DC-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0437\u0438\u0433\u0437\u0430\u0433-\u0442\u0430\u0431\u043b\u0438\u0446, \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u2014 \u0410\u0421-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0437\u0438\u0433\u0437\u0430\u0433-\u0442\u0430\u0431\u043b\u0438\u0446. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u0438 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c DC- \u0438 \u0410\u0421-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u0434\u0432\u0443\u0445 \u043c\u0430\u0442\u0440\u0438\u0446. \u0414\u041a\u041f-\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u043a\u0430\u043d\u0430\u043b\u043e\u0432 \u044f\u0440\u043a\u043e\u0441\u0442\u0438 \u0438 \u0445\u0440\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e, \u0442\u0430\u043a \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0434\u0432\u0430 \u043d\u0430\u0431\u043e\u0440\u0430 DC- \u0438 \u0434\u0432\u0430 \u043d\u0430\u0431\u043e\u0440\u0430 AC-\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u0432 \u0441\u0443\u043c\u043c\u0435 4 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0425\u0430\u0444\u0444\u043c\u0430\u043d\u0430.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e \u0432 \u043e\u0442\u0442\u0435\u043d\u043a\u0430\u0445 \u0441\u0435\u0440\u043e\u0433\u043e, \u0442\u043e \u0443 \u043d\u0430\u0441 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0432\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0425\u0430\u0444\u0444\u043c\u0430\u043d\u0430 (\u043e\u0434\u043d\u0430 \u0434\u043b\u044f DC \u0438 \u043e\u0434\u043d\u0430 \u0434\u043b\u044f AC), \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u0446\u0432\u0435\u0442. \u041a\u0430\u043a \u0432\u044b \u0443\u0436\u0435 \u043c\u043e\u0433\u043b\u0438 \u043f\u043e\u043d\u044f\u0442\u044c, \u0434\u0432\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0425\u0430\u0444\u0444\u043c\u0430\u043d\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0430\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0445 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e JPEG.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0437\u043d\u0430\u0435\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 JPEG-\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e.<\/p>\n<h2>\u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 JPEG<\/h2>\n<p>  \u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u044d\u0442\u0430\u043f\u044b:<\/p>\n<ol>\n<li>\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446 \u0425\u0430\u0444\u0444\u043c\u0430\u043d\u0430 \u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u0438\u0442\u043e\u0432.<\/li>\n<li>\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0414\u041a\u041f-\u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u043e\u0432 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0442\u043a\u0430\u0442\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u0438\u043d \u0441\u0435\u0440\u0438\u0439 \u0438 \u0434\u0435\u043b\u044c\u0442\u0430-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/li>\n<li>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0414\u041a\u041f-\u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u044b\u0445 \u0432\u043e\u043b\u043d \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 8&#215;8.<\/li>\n<li>\u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 YCbCr \u0432 RGB \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f.<\/li>\n<li>\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u0433\u043e\u0441\u044f RGB-\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/li>\n<\/ol>\n<p>  \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442 JPEG \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0447\u0435\u0442\u044b\u0440\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0441\u0436\u0430\u0442\u0438\u044f:<\/p>\n<ul>\n<li>\u0411\u0430\u0437\u043e\u0432\u044b\u0439<\/li>\n<li>\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439<\/li>\n<li>\u041f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u044b\u0439<\/li>\n<li>\u0411\u0435\u0437 \u043f\u043e\u0442\u0435\u0440\u044c<\/li>\n<\/ul>\n<p>  \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0431\u0430\u0437\u043e\u0432\u044b\u043c \u0441\u0436\u0430\u0442\u0438\u0435\u043c. \u041e\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0435\u0440\u0438\u044e \u0431\u043b\u043e\u043a\u043e\u0432 8\u04458, \u0438\u0434\u0443\u0449\u0438\u0445 \u0434\u0440\u0443\u0433 \u0437\u0430 \u0434\u0440\u0443\u0433\u043e\u043c. \u0412 \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u0430\u0445 \u0448\u0430\u0431\u043b\u043e\u043d \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f. \u0427\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u044f \u0440\u0430\u0441\u043a\u0440\u0430\u0441\u0438\u043b \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043d\u0430\u0448\u0435\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/2dd\/6be\/c55\/2dd6bec55c899fbf40a53d739e130b7e.png\"><\/div>\n<p>  <\/p>\n<h3>\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446 \u0425\u0430\u0444\u0444\u043c\u0430\u043d\u0430<\/h3>\n<p>  \u041c\u044b \u0443\u0436\u0435 \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e JPEG \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0447\u0435\u0442\u044b\u0440\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0425\u0430\u0444\u0444\u043c\u0430\u043d\u0430. \u042d\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u044b \u043d\u0430\u0447\u043d\u0451\u043c \u0441 \u043d\u0435\u0433\u043e. \u0412 \u043a\u0430\u0436\u0434\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f:<\/p>\n<div class=\"scrollable-table\">\n<table>\n<tr>\n<th>\u041f\u043e\u043b\u0435<\/th>\n<th>\u0420\u0430\u0437\u043c\u0435\u0440<\/th>\n<th>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/th>\n<\/tr>\n<tr>\n<td>\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043c\u0430\u0440\u043a\u0435\u0440\u0430<\/td>\n<td>2 \u0431\u0430\u0439\u0442\u0430<\/td>\n<td>0xff \u0438 0xc4 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0442 DHT<\/td>\n<\/tr>\n<tr>\n<td>\u0414\u043b\u0438\u043d\u0430<\/td>\n<td>2 \u0431\u0430\u0439\u0442\u0430<\/td>\n<td>\u0414\u043b\u0438\u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b<\/td>\n<\/tr>\n<tr>\n<td>\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0425\u0430\u0444\u0444\u043c\u0430\u043d\u0430<\/td>\n<td>1 \u0431\u0430\u0439\u0442<\/td>\n<td>\u0431\u0438\u0442\u044b 0&#8230;3: \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0430\u0431\u043b\u0438\u0446 (0&#8230;3, \u0438\u043d\u0430\u0447\u0435 \u043e\u0448\u0438\u0431\u043a\u0430)\u0431\u0438\u0442 4: \u0442\u0438\u043f \u0442\u0430\u0431\u043b\u0438\u0446\u044b, 0 = DC-\u0442\u0430\u0431\u043b\u0438\u0446\u0430, 1 = AC-\u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0431\u0438\u0442\u044b 5&#8230;7: \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f, \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0440\u0430\u0432\u043d\u044b 0<\/td>\n<\/tr>\n<tr>\n<td>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432<\/td>\n<td>16 \u0431\u0430\u0439\u0442\u043e\u0432<\/td>\n<td>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0441 \u043a\u043e\u0434\u0430\u043c\u0438 \u0434\u043b\u0438\u043d\u044b 1&#8230;16, sum(n) \u044d\u0442\u0438\u0445 \u0431\u0430\u0439\u0442\u043e\u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c &lt;= 256<\/td>\n<\/tr>\n<tr>\n<td>\u0421\u0438\u043c\u0432\u043e\u043b\u044b<\/td>\n<td>n \u0431\u0430\u0439\u0442\u043e\u0432<\/td>\n<td>\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u0438\u043d\u044b \u043a\u043e\u0434\u0430 (n = \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u0434\u043e\u0432).<\/td>\n<\/tr>\n<\/table>\n<\/div>\n<p>  \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0443 \u043d\u0430\u0441 \u0442\u0430\u043a\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0425\u0430\u0444\u0444\u043c\u0430\u043d\u0430 (<a href=\"https:\/\/koushtav.me\/jpeg\/tutorial\/c++\/decoder\/2019\/03\/02\/lets-write-a-simple-jpeg-library-part-2\/\">\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a<\/a>):<\/p>\n<div class=\"scrollable-table\">\n<table>\n<tr>\n<th>\u0421\u0438\u043c\u0432\u043e\u043b<\/th>\n<th>\u041a\u043e\u0434 \u0425\u0430\u0444\u0444\u043c\u0430\u043d\u0430<\/th>\n<th>\u0414\u043b\u0438\u043d\u0430 \u043a\u043e\u0434\u0430<\/th>\n<\/tr>\n<tr>\n<td>a<\/td>\n<td>00<\/td>\n<td>2<\/td>\n<\/tr>\n<tr>\n<td>b<\/td>\n<td>010<\/td>\n<td>3<\/td>\n<\/tr>\n<tr>\n<td>c<\/td>\n<td>011<\/td>\n<td>3<\/td>\n<\/tr>\n<tr>\n<td>d<\/td>\n<td>100<\/td>\n<td>3<\/td>\n<\/tr>\n<tr>\n<td>e<\/td>\n<td>101<\/td>\n<td>3<\/td>\n<\/tr>\n<tr>\n<td>f<\/td>\n<td>110<\/td>\n<td>3<\/td>\n<\/tr>\n<tr>\n<td>g<\/td>\n<td>1110<\/td>\n<td>4<\/td>\n<\/tr>\n<tr>\n<td>h<\/td>\n<td>11110<\/td>\n<td>5<\/td>\n<\/tr>\n<tr>\n<td>i<\/td>\n<td>111110<\/td>\n<td>6<\/td>\n<\/tr>\n<tr>\n<td>j<\/td>\n<td>1111110<\/td>\n<td>7<\/td>\n<\/tr>\n<tr>\n<td>k<\/td>\n<td>11111110<\/td>\n<td>8<\/td>\n<\/tr>\n<tr>\n<td>l<\/td>\n<td>111111110<\/td>\n<td>9<\/td>\n<\/tr>\n<\/table>\n<\/div>\n<p>  \u041e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0432 JFIF-\u0444\u0430\u0439\u043b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435 (\u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435. \u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e ASCII \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438):<\/p>\n<pre><code class=\"plaintext\">0 1 5 1 1 1 1 1 1 0 0 0 0 0 0 0 a b c d e f g h i j k l <\/code><\/pre>\n<p>  0 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u043d\u0435\u0442 \u043a\u043e\u0434\u0430 \u0425\u0430\u0444\u0444\u043c\u0430\u043d\u0430 \u0434\u043b\u0438\u043d\u043e\u0439 1. \u0410 1 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u043e\u0434\u0438\u043d \u043a\u043e\u0434 \u0425\u0430\u0444\u0444\u043c\u0430\u043d\u0430 \u0434\u043b\u0438\u043d\u043e\u0439 2, \u0438 \u0442.\u0434. \u0412 DHT-\u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438 ID \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043b\u0438\u043d\u043e\u0439 16 \u0431\u0430\u0439\u0442\u043e\u0432. \u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043a\u043e\u0434 \u0434\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u0438\u043d \u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u0437 DHT.<\/p>\n<pre><code class=\"plaintext\">class JPEG:     # ...          def decodeHuffman(self, data):         offset = 0         header, = unpack(&quot;B&quot;,data[offset:offset+1])         offset += 1          # Extract the 16 bytes containing length data         lengths = unpack(&quot;BBBBBBBBBBBBBBBB&quot;, data[offset:offset+16])          offset += 16          # Extract the elements after the initial 16 bytes         elements = []         for i in lengths:             elements += (unpack(&quot;B&quot;*i, data[offset:offset+i]))             offset += i           print(&quot;Header: &quot;,header)         print(&quot;lengths: &quot;, lengths)         print(&quot;Elements: &quot;, len(elements))         data = data[offset:]           def decode(self):         data = self.img_data         while(True):             # ---             else:                 len_chunk, = unpack(&quot;&gt;H&quot;, data[2:4])                 len_chunk += 2                 chunk = data[4:len_chunk]                  if marker == 0xffc4:                     self.decodeHuffman(chunk)                 data = data[len_chunk:]                         if len(data)==0: break <\/code><\/pre>\n<p>  \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u043a\u043e\u0434, \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0432\u043e\u0442 \u0447\u0442\u043e:<\/p>\n<pre><code class=\"plaintext\">Start of Image Application Default Header Quantization Table Quantization Table Start of Frame Huffman Table Header:  0 lengths:  (0, 2, 2, 3, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0) Elements:  10 Huffman Table Header:  16 lengths:  (0, 2, 1, 3, 2, 4, 5, 2, 4, 4, 3, 4, 8, 5, 5, 1) Elements:  53 Huffman Table Header:  1 lengths:  (0, 2, 3, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) Elements:  8 Huffman Table Header:  17 lengths:  (0, 2, 2, 2, 2, 2, 1, 3, 3, 1, 7, 4, 2, 3, 0, 0) Elements:  34 Start of Scan End of Image <\/code><\/pre>\n<p>  \u041e\u0442\u043b\u0438\u0447\u043d\u043e! \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u043b\u0438\u043d\u044b \u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0425\u0430\u0444\u0444\u043c\u0430\u043d\u0430, \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0438\u0437 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0434\u043b\u0438\u043d \u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. \u042f \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u044e \u043a\u043e\u0434 <a href=\"https:\/\/github.com\/aguaviva\/micro-jpeg-visualizer\">\u043e\u0442\u0441\u044e\u0434\u0430<\/a>:<\/p>\n<pre><code class=\"plaintext\">class HuffmanTable:     def __init__(self):         self.root=[]         self.elements = []          def BitsFromLengths(self, root, element, pos):         if isinstance(root,list):             if pos==0:                 if len(root)&lt;2:                     root.append(element)                     return True                                 return False             for i in [0,1]:                 if len(root) == i:                     root.append([])                 if self.BitsFromLengths(root[i], element, pos-1) == True:                     return True         return False          def GetHuffmanBits(self,  lengths, elements):         self.elements = elements         ii = 0         for i in range(len(lengths)):             for j in range(lengths[i]):                 self.BitsFromLengths(self.root, elements[ii], i)                 ii+=1      def Find(self,st):         r = self.root         while isinstance(r, list):             r=r[st.GetBit()]         return  r       def GetCode(self, st):         while(True):             res = self.Find(st)             if res == 0:                 return 0             elif ( res != -1):                 return res                  class JPEG:     # -----      def decodeHuffman(self, data):         # ----         hf = HuffmanTable()         hf.GetHuffmanBits(lengths, elements)         data = data[offset:] <\/code><\/pre>\n<p>  <code>GetHuffmanBits<\/code> \u0431\u0435\u0440\u0451\u0442 \u0434\u043b\u0438\u043d\u044b \u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c \u0438 \u043a\u043b\u0430\u0434\u0451\u0442 \u0438\u0445 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a <code>root<\/code>. \u041e\u043d \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0441\u043f\u0438\u0441\u043a\u0438. \u041c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u0435\u0440\u0435\u0432\u043e \u0425\u0430\u0444\u0444\u043c\u0430\u043d\u0430 \u0438 \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 Python. \u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0435\u0440\u0432\u043e\u0433\u043e DHT (\u0438\u0437 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438) \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0434\u043b\u0438\u043d\u044b \u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b:<\/p>\n<pre><code class=\"plaintext\">Hex Data: 00 02 02 03 01 01 01 00 00 00 00 00 00 00 00 00 Lengths:  (0, 2, 2, 3, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0) Elements: [5, 6, 3, 4, 2, 7, 8, 1, 0, 9] <\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 <code>GetHuffmanBits<\/code> \u0441\u043f\u0438\u0441\u043e\u043a <code>root<\/code> \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<pre><code class=\"plaintext\">[[5, 6], [[3, 4], [[2, 7], [8, [1, [0, [9]]]]]]] <\/code><\/pre>\n<p>  <code>HuffmanTable<\/code> \u0442\u0430\u043a\u0436\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u0435\u0442\u043e\u0434 <code>GetCode<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u0434\u0435\u0440\u0435\u0432\u0443 \u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0425\u0430\u0444\u0444\u043c\u0430\u043d\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0431\u0438\u0442\u044b. \u041d\u0430 \u0432\u0445\u043e\u0434 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0431\u0438\u0442\u043e\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0431\u0438\u0442\u043e\u0432\u044b\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u0434\u043b\u044f <code>abc<\/code> \u0431\u0443\u0434\u0435\u0442 <code>011000010110001001100011<\/code>. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0432 \u0435\u0433\u043e ASCII-\u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043a\u043e\u0434. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0432 \u0431\u0438\u0442\u044b, \u0430 \u0437\u0430\u0442\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0431\u0438\u0442\u044b \u043e\u0434\u0438\u043d \u0437\u0430 \u0434\u0440\u0443\u0433\u0438\u043c:<\/p>\n<pre><code class=\"plaintext\">class Stream:     def __init__(self, data):         self.data= data         self.pos = 0      def GetBit(self):         b = self.data[self.pos &gt;&gt; 3]         s = 7-(self.pos &amp; 0x7)         self.pos+=1         return (b &gt;&gt; s) &amp; 1      def GetBitN(self, l):         val = 0         for i in range(l):             val = val*2 + self.GetBit()         return val <\/code><\/pre>\n<p>  \u041f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u044b \u0434\u0430\u0451\u043c \u043a\u043b\u0430\u0441\u0441\u0443 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0430 \u0437\u0430\u0442\u0435\u043c \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0438\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>GetBit<\/code> \u0438 <code>GetBitN<\/code>.<\/p>\n<h3>\u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0438\u044f<\/h3>\n<p>  \u0420\u0430\u0437\u0434\u0435\u043b Define Quantization Table \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0430\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<div class=\"scrollable-table\">\n<table>\n<tr>\n<th>\u041f\u043e\u043b\u0435<\/th>\n<th>\u0420\u0430\u0437\u043c\u0435\u0440<\/th>\n<th>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/th>\n<\/tr>\n<tr>\n<td>\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043c\u0430\u0440\u043a\u0435\u0440\u0430<\/td>\n<td>2 \u0431\u0430\u0439\u0442\u0430<\/td>\n<td>0xff \u0438 0xdb \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0442 \u0440\u0430\u0437\u0434\u0435\u043b DQT<\/td>\n<\/tr>\n<tr>\n<td>\u0414\u043b\u0438\u043d\u0430<\/td>\n<td>2 \u0431\u0430\u0439\u0442\u0430<\/td>\n<td>\u0414\u043b\u0438\u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0438\u044f<\/td>\n<\/tr>\n<tr>\n<td>\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0438\u0438<\/td>\n<td>1 \u0431\u0430\u0439\u0442<\/td>\n<td>\u0431\u0438\u0442\u044b 0&#8230;3: \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0430\u0431\u043b\u0438\u0446 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0438\u044f (0&#8230;3, \u0438\u043d\u0430\u0447\u0435 \u043e\u0448\u0438\u0431\u043a\u0430) \u0431\u0438\u0442\u044b 4&#8230;7: \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0438\u044f, 0 = 8 \u0431\u0438\u0442\u043e\u0432, \u0438\u043d\u0430\u0447\u0435 16 \u0431\u0438\u0442\u043e\u0432<\/td>\n<\/tr>\n<tr>\n<td>\u0411\u0430\u0439\u0442\u044b<\/td>\n<td>n \u0431\u0430\u0439\u0442\u043e\u0432<\/td>\n<td>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0438\u044f, n = 64*(\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c+1)<\/td>\n<\/tr>\n<\/table>\n<\/div>\n<p>  \u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0443 JPEG, \u0432 JPEG-\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0438\u044f: \u0434\u043b\u044f \u044f\u0440\u043a\u043e\u0441\u0442\u0438 \u0438 \u0445\u0440\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u0438. \u041e\u043d\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0441 \u043c\u0430\u0440\u043a\u0435\u0440\u0430 <code>0xffdb<\/code>. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u0443\u0436\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0432\u0430 \u0442\u0430\u043a\u0438\u0445 \u043c\u0430\u0440\u043a\u0435\u0440\u0430. \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"plaintext\">def GetArray(type,l, length):     s = &quot;&quot;     for i in range(length):         s =s+type     return list(unpack(s,l[:length]))    class JPEG:     # ------     def __init__(self, image_file):         self.huffman_tables = {}         self.quant = {}         with open(image_file, 'rb') as f:             self.img_data = f.read()      def DefineQuantizationTables(self, data):         hdr, = unpack(&quot;B&quot;,data[0:1])         self.quant[hdr] =  GetArray(&quot;B&quot;, data[1:1+64],64)         data = data[65:]      def decodeHuffman(self, data):         # ------          for i in lengths:             elements += (GetArray(&quot;B&quot;, data[off:off+i], i))             offset += i              # ------      def decode(self):         # ------         while(True):             # ----             else:                 # -----                 if marker == 0xffc4:                     self.decodeHuffman(chunk)                 elif marker == 0xffdb:                     self.DefineQuantizationTables(chunk)                 data = data[len_chunk:]                         if len(data)==0:                 break         <\/code><\/pre>\n<p>  \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \u043c\u0435\u0442\u043e\u0434 <code>GetArray<\/code>. \u042d\u0442\u043e \u043b\u0438\u0448\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0431\u0430\u0439\u0442\u043e\u0432 \u0438\u0437 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0422\u0430\u043a\u0436\u0435 \u043c\u044b \u0437\u0430\u043c\u0435\u043d\u0438\u043b\u0438 \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u0434\u0430 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <code>decodeHuffman<\/code>, \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u043e\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439. \u0417\u0430\u0442\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \u043c\u0435\u0442\u043e\u0434 <code>DefineQuantizationTables<\/code>: \u043e\u043d\u0430 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0438\u044f, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u0441\u043b\u043e\u0432\u0430\u0440\u044e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043a\u043b\u044e\u0447\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430. \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0432\u043d\u043e 0 \u0434\u043b\u044f \u044f\u0440\u043a\u043e\u0441\u0442\u0438 \u0438 1 \u0434\u043b\u044f \u0445\u0440\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u0438. \u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437\u0434\u0435\u043b \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0438\u044f \u0432 JFIF \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 64 \u0431\u0430\u0439\u0442\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0434\u043b\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0438\u044f 8\u04458).<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0432\u043e\u0442 \u0447\u0442\u043e:<\/p>\n<pre><code class=\"plaintext\">3    2    2    3    2    2    3    3    3    3    4    3    3    4    5    8    5    5    4    4    5    10   7    7    6    8    12   10   12   12   11   10   11   11   13   14   18   16   13   14   17   14   11   11   16   22   16   17   19   20   21   21   21   12   15   23   24   22   20   24   18   20   21   20    3     2    2    3    2    2    3    3 3     2    2    3    2    2    3    3 3     3    4    3    3    4    5    8 5     5    4    4    5    10   7    7 6     8    12   10   12   12   11   10 11    11   13   14   18   16   13   14 17    14   11   11   16   22   16   17 19    20   21   21   21   12   15   23 24    22   20   24   18   20   21   20 <\/code><\/pre>\n<p>  <\/p>\n<h3>\u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u0430\u0434\u0440\u0430<\/h3>\n<p>  \u0420\u0430\u0437\u0434\u0435\u043b Start of Frame \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0430\u043a\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e (<a href=\"http:\/\/vip.sugovica.hu\/Sardi\/kepnezo\/JPEG%20File%20Layout%20and%20Format.htm\">\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a<\/a>):<\/p>\n<div class=\"scrollable-table\">\n<table>\n<tr>\n<th>\u041f\u043e\u043b\u0435<\/th>\n<th>\u0420\u0430\u0437\u043c\u0435\u0440<\/th>\n<th>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/th>\n<\/tr>\n<tr>\n<td>\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043c\u0430\u0440\u043a\u0435\u0440\u0430<\/td>\n<td>2 \u0431\u0430\u0439\u0442\u0430<\/td>\n<td>0xff \u0438 0xc0 \u0434\u043b\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043c\u0430\u0440\u043a\u0435\u0440\u0430 SOF<\/td>\n<\/tr>\n<tr>\n<td>\u0414\u043b\u0438\u043d\u0430<\/td>\n<td>2 \u0431\u0430\u0439\u0442\u0430<\/td>\n<td>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0435 8 + \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b*3<\/td>\n<\/tr>\n<tr>\n<td>\u0422\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445<\/td>\n<td>1 \u0431\u0430\u0439\u0442<\/td>\n<td>\u042d\u0442\u043e \u0432 \u0431\u0438\u0442\u0430\u0445 \u0432 \u043e\u0431\u0440\u0430\u0437\u0446\u0435, \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0430\u0432\u043d\u043e 8 (12 \u0438 16 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439).<\/td>\n<\/tr>\n<tr>\n<td>\u0412\u044b\u0441\u043e\u0442\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/td>\n<td>2 \u0431\u0430\u0439\u0442\u0430<\/td>\n<td>\u0414\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c &gt; 0<\/td>\n<\/tr>\n<tr>\n<td>\u0428\u0438\u0440\u0438\u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/td>\n<td>2 \u0431\u0430\u0439\u0442\u0430<\/td>\n<td>\u0414\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c &gt; 0<\/td>\n<\/tr>\n<tr>\n<td>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432<\/td>\n<td>1 \u0431\u0430\u0439\u0442<\/td>\n<td>\u041e\u0431\u044b\u0447\u043d\u043e 1 = \u043e\u0442\u0442\u0435\u043d\u043a\u0438 \u0441\u0435\u0440\u043e\u0433\u043e, 3 = YcbCr \u0438\u043b\u0438 YIQ<\/td>\n<\/tr>\n<tr>\n<td>\u041a\u0430\u0436\u0434\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442<\/td>\n<td>3 \u0431\u0430\u0439\u0442\u0430<\/td>\n<td>\u0421\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e 3 \u0431\u0430\u0439\u0442\u0430. \u041e\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 (1 \u0431\u0430\u0439\u0442) (1 = Y, 2 = Cb, 3 = Cr, 4 = I, 5 = Q), \u0444\u0430\u043a\u0442\u043e\u0440\u044b \u0432\u044b\u0431\u043e\u0440\u043a\u0438 (1 \u0431\u0430\u0439\u0442) (\u0431\u0438\u0442\u044b 0&#8230;3 \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438, 4&#8230;7 \u043f\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438), \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0430\u0431\u043b\u0438\u0446 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0438\u044f (1 \u0431\u0430\u0439\u0442).<\/td>\n<\/tr>\n<\/table>\n<\/div>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043d\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043d\u0435 \u0432\u0441\u0451. \u041c\u044b \u0438\u0437\u0432\u043b\u0435\u0447\u0451\u043c \u0448\u0438\u0440\u0438\u043d\u0443 \u0438 \u0432\u044b\u0441\u043e\u0442\u0443 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0430\u0431\u043b\u0438\u0446 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430. \u0428\u0438\u0440\u0438\u043d\u0443 \u0438 \u0432\u044b\u0441\u043e\u0442\u0443 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u043a\u0430\u043d\u043e\u0432 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u0437 \u0440\u0430\u0437\u0434\u0435\u043b\u0430 Start of Scan. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441 YCbCr-\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c, \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0442\u0440\u0438, \u0430 \u0438\u0445 \u0442\u0438\u043f\u044b \u0431\u0443\u0434\u0443\u0442 1, 2 \u0438 3 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e. \u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043a\u043e\u0434 \u0434\u043b\u044f \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445:<\/p>\n<pre><code class=\"plaintext\">class JPEG:     def __init__(self, image_file):         self.huffman_tables = {}         self.quant = {}         self.quantMapping = []         with open(image_file, 'rb') as f:             self.img_data = f.read()     # ----     def BaselineDCT(self, data):         hdr, self.height, self.width, components = unpack(&quot;&gt;BHHB&quot;,data[0:6])         print(&quot;size %ix%i&quot; % (self.width,  self.height))          for i in range(components):             id, samp, QtbId = unpack(&quot;BBB&quot;,data[6+i*3:9+i*3])             self.quantMapping.append(QtbId)                   def decode(self):         # ----         while(True):                 # -----                 elif marker == 0xffdb:                     self.DefineQuantizationTables(chunk)                 elif marker == 0xffc0:                     self.BaselineDCT(chunk)                 data = data[len_chunk:]                         if len(data)==0:                 break         <\/code><\/pre>\n<p>  \u041c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0432 JPEG-\u043a\u043b\u0430\u0441\u0441 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u0441\u043f\u0438\u0441\u043a\u0430 <code>quantMapping<\/code> \u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438 \u043c\u0435\u0442\u043e\u0434 <code>BaselineDCT<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 SOF-\u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u0438 \u043a\u043b\u0430\u0434\u0451\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0430\u0431\u043b\u0438\u0446 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0432 \u0441\u043f\u0438\u0441\u043e\u043a <code>quantMapping<\/code>. \u041c\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u044d\u0442\u0438\u043c, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0447\u043d\u0451\u043c \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u0434\u0435\u043b Start of Scan. \u0422\u0430\u043a \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 <code>quantMapping<\/code>:<\/p>\n<pre><code class=\"plaintext\">Quant mapping:  [0, 1, 1] <\/code><\/pre>\n<p>  <\/p>\n<h3>\u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Start of Scan<\/h3>\n<p>  \u042d\u0442\u043e \u00ab\u043c\u044f\u0441\u043a\u043e\u00bb JPEG-\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043e\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u0430\u043c\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438. \u041c\u044b \u0434\u043e\u0448\u043b\u0438 \u0434\u043e \u0441\u0430\u043c\u043e\u0433\u043e \u0432\u0430\u0436\u043d\u043e\u0433\u043e \u044d\u0442\u0430\u043f\u0430. \u0412\u0441\u0451, \u0447\u0442\u043e \u043c\u044b \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0434\u043e \u044d\u0442\u043e\u0433\u043e, \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043d\u0430\u043c \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0430\u043c\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435. \u0412 \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0441\u0430\u043c\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 (\u0432 \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435). \u041c\u044b \u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b \u0438 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u0443\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0443\u0436\u0435 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>  \u0412\u0441\u0435 \u043c\u0430\u0440\u043a\u0435\u0440\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u0438\u0441\u044c \u0441 <code>0xff<\/code>. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0447\u0430\u0441\u0442\u044c\u044e \u0441\u043a\u0430\u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043d\u043e \u0435\u0441\u043b\u0438 \u043e\u043d\u043e \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u044d\u0442\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435, \u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0433\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0438\u0434\u0442\u0438 \u0438 <code>0x00<\/code>. JPEG-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u044d\u0442\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u00ab\u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0431\u0430\u0439\u0442\u043e\u0432\u00bb (byte stuffing). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u044d\u0442\u0438 <code>0x00<\/code>. \u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e SOS \u043c\u0435\u0442\u043e\u0434\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0433\u043e \u0442\u0430\u043a\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0438 \u0438\u0437\u0431\u0430\u0432\u0438\u043c\u0441\u044f \u043e\u0442 \u0438\u043c\u0435\u044e\u0449\u0438\u0445\u0441\u044f <code>0x00<\/code>. \u0412 \u043d\u0430\u0448\u0435\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0441\u043e \u0441\u043a\u0430\u043d\u043e\u043c \u043d\u0435\u0442 <code>0xff<\/code>, \u043d\u043e \u044d\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435.<\/p>\n<pre><code class=\"plaintext\">def RemoveFF00(data):     datapro = []     i = 0     while(True):         b,bnext = unpack(&quot;BB&quot;,data[i:i+2])                 if (b == 0xff):             if (bnext != 0):                 break             datapro.append(data[i])             i+=2         else:             datapro.append(data[i])             i+=1     return datapro,i  class JPEG:     # ----     def StartOfScan(self, data, hdrlen):         data,lenchunk = RemoveFF00(data[hdrlen:])         return lenchunk+hdrlen            def decode(self):         data = self.img_data         while(True):             marker, = unpack(&quot;&gt;H&quot;, data[0:2])             print(marker_mapping.get(marker))             if marker == 0xffd8:                 data = data[2:]             elif marker == 0xffd9:                 return             else:                 len_chunk, = unpack(&quot;&gt;H&quot;, data[2:4])                 len_chunk += 2                 chunk = data[4:len_chunk]                 if marker == 0xffc4:                     self.decodeHuffman(chunk)                 elif marker == 0xffdb:                     self.DefineQuantizationTables(chunk)                 elif marker == 0xffc0:                     self.BaselineDCT(chunk)                 elif marker == 0xffda:                     len_chunk = self.StartOfScan(data, len_chunk)                 data = data[len_chunk:]                         if len(data)==0:                 break <\/code><\/pre>\n<p>  \u0420\u0430\u043d\u044c\u0448\u0435 \u043c\u044b \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0438\u0441\u043a\u0430\u043b\u0438 \u043a\u043e\u043d\u0435\u0446 \u0444\u0430\u0439\u043b\u0430, \u043a\u043e\u0433\u0434\u0430 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u043b\u0438 \u043c\u0430\u0440\u043a\u0435\u0440 <code>0xffda<\/code>, \u043d\u043e \u0442\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u0444\u0430\u0439\u043b, \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0451\u043c \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u043c\u0430\u0440\u043a\u0435\u0440\u0430 \u0432\u043d\u0443\u0442\u0440\u044c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 <code>else<\/code>. \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>RemoveFF00<\/code> \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0447\u0442\u043e-\u0442\u043e \u0438\u043d\u043e\u0435 \u0432\u043c\u0435\u0441\u0442\u043e <code>0x00<\/code> \u043f\u043e\u0441\u043b\u0435 <code>0xff<\/code>. \u0426\u0438\u043a\u043b \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0430\u0445\u043e\u0434\u0438\u0442 <code>0xffd9<\/code>, \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043a\u0430\u0442\u044c \u043a\u043e\u043d\u0435\u0446 \u0444\u0430\u0439\u043b\u0430, \u043d\u0435 \u043e\u043f\u0430\u0441\u0430\u044f\u0441\u044c \u0441\u044e\u0440\u043f\u0440\u0438\u0437\u043e\u0432. \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434, \u0442\u043e \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u043d\u0435 \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u043e\u0432\u043e\u0433\u043e.<\/p>\n<p>  \u041a\u0430\u043a \u0432\u044b \u043f\u043e\u043c\u043d\u0438\u0442\u0435, JPEG \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u043c\u0430\u0442\u0440\u0438\u0446\u044b 8\u04458. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441\u043a\u0430\u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0431\u0438\u0442\u043e\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0435\u0433\u043e \u043f\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u043c 8\u04458. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u043e\u0434 \u0432 \u043d\u0430\u0448 \u043a\u043b\u0430\u0441\u0441:<\/p>\n<pre><code class=\"plaintext\">class JPEG:     # -----     def StartOfScan(self, data, hdrlen):         data,lenchunk = RemoveFF00(data[hdrlen:])         st = Stream(data)         oldlumdccoeff, oldCbdccoeff, oldCrdccoeff = 0, 0, 0         for y in range(self.height\/\/8):             for x in range(self.width\/\/8):                 matL, oldlumdccoeff = self.BuildMatrix(st,0, self.quant[self.quantMapping[0]], oldlumdccoeff)                 matCr, oldCrdccoeff = self.BuildMatrix(st,1, self.quant[self.quantMapping[1]], oldCrdccoeff)                 matCb, oldCbdccoeff = self.BuildMatrix(st,1, self.quant[self.quantMapping[2]], oldCbdccoeff)                 DrawMatrix(x, y, matL.base, matCb.base, matCr.base )                      return lenchunk +hdrlen <\/code><\/pre>\n<p>  \u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0431\u0438\u0442\u043e\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a. \u0412\u044b \u043f\u043e\u043c\u043d\u0438\u0442\u0435, \u0447\u0442\u043e \u043a DC-\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0438\u044f (\u0435\u0451 \u043f\u0435\u0440\u0432\u043e\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443) \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u0435\u043b\u044c\u0442\u0430-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e DC-\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430? \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c <code>oldlumdccoeff<\/code>, <code>oldCbdccoeff<\/code> \u0438 <code>oldCrdccoeff<\/code> \u0441 \u043d\u0443\u043b\u0435\u0432\u044b\u043c\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438, \u043e\u043d\u0438 \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u043c \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 DC-\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0430 0 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0434\u0430\u043d \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043d\u0430\u0439\u0434\u0451\u043c \u043f\u0435\u0440\u0432\u044b\u0439 DC-\u044d\u043b\u0435\u043c\u0435\u043d\u0442.<\/p>\n<p>  \u0426\u0438\u043a\u043b <code>for<\/code> \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u043c. <code>self.height\/\/8<\/code> \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043d\u0430\u043c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u044b\u0441\u043e\u0442\u0443 \u043d\u0430 8 8, \u0438 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0441 \u0448\u0438\u0440\u0438\u043d\u043e\u0439 \u0438 <code>self.width\/\/8<\/code>.<\/p>\n<p>  <code>BuildMatrix<\/code> \u0432\u043e\u0437\u044c\u043c\u0451\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0434\u0430\u0441\u0442 \u043d\u0430\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u044b Y, Cr \u0438 Cb. \u0410 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>DrawMatrix<\/code> \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0438\u0445 \u0432 RGB.<\/p>\n<p>  \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u043b\u0430\u0441\u0441 <code>IDCT<\/code>, \u0430 \u0437\u0430\u0442\u0435\u043c \u043d\u0430\u0447\u043d\u0451\u043c \u043d\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>BuildMatrix<\/code>.<\/p>\n<pre><code class=\"plaintext\">import math  class IDCT:     &quot;&quot;&quot;     An inverse Discrete Cosine Transformation Class     &quot;&quot;&quot;      def __init__(self):         self.base = [0] * 64         self.zigzag = [             [0, 1, 5, 6, 14, 15, 27, 28],             [2, 4, 7, 13, 16, 26, 29, 42],             [3, 8, 12, 17, 25, 30, 41, 43],             [9, 11, 18, 24, 31, 40, 44, 53],             [10, 19, 23, 32, 39, 45, 52, 54],             [20, 22, 33, 38, 46, 51, 55, 60],             [21, 34, 37, 47, 50, 56, 59, 61],             [35, 36, 48, 49, 57, 58, 62, 63],         ]         self.idct_precision = 8         self.idct_table = [             [                 (self.NormCoeff(u) * math.cos(((2.0 * x + 1.0) * u * math.pi) \/ 16.0))                 for x in range(self.idct_precision)             ]             for u in range(self.idct_precision)         ]      def NormCoeff(self, n):         if n == 0:             return 1.0 \/ math.sqrt(2.0)         else:             return 1.0      def rearrange_using_zigzag(self):         for x in range(8):             for y in range(8):                 self.zigzag[x][y] = self.base[self.zigzag[x][y]]         return self.zigzag      def perform_IDCT(self):         out = [list(range(8)) for i in range(8)]          for x in range(8):             for y in range(8):                 local_sum = 0                 for u in range(self.idct_precision):                     for v in range(self.idct_precision):                         local_sum += (                             self.zigzag[v][u]                             * self.idct_table[u][x]                             * self.idct_table[v][y]                         )                 out[y][x] = local_sum \/\/ 4         self.base = out <\/code><\/pre>\n<p>  \u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u043a\u043b\u0430\u0441\u0441 <code>IDCT<\/code>. \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c MCU, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0432 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0435 <code>base<\/code>. \u0417\u0430\u0442\u0435\u043c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 MCU, \u043e\u0442\u043a\u0430\u0442\u0438\u0432 \u0437\u0438\u0433\u0437\u0430\u0433-\u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>rearrange_using_zigzag<\/code>. \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043c\u044b \u043e\u0442\u043a\u0430\u0442\u0438\u043c \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u043e\u0435 \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u043e\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435, \u0432\u044b\u0437\u0432\u0430\u0432 \u043c\u0435\u0442\u043e\u0434 <code>perform_IDCT<\/code>.<\/p>\n<p>  \u041a\u0430\u043a \u0432\u044b \u043f\u043e\u043c\u043d\u0438\u0442\u0435, \u0414\u041a-\u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0430. \u041c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0414\u041a\u041f, \u044d\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0435, \u0447\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u044d\u0442\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432 \u0432\u0438\u0434\u0435 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043f\u0430\u0440 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 <code>x,y<\/code>. \u042f \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438 \u0435\u0451 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0432 \u043a\u043b\u0430\u0441\u0441 <code>IDCT<\/code>, \u0447\u0442\u043e\u0431\u044b \u0442\u0435\u043a\u0441\u0442 \u0431\u044b\u043b \u0443\u0434\u043e\u0431\u043e\u0447\u0438\u0442\u0430\u0435\u043c\u044b\u043c. \u041a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u044b MCU \u0443\u043c\u043d\u043e\u0436\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>idc_variable<\/code>, \u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f Y, Cr \u0438 Cb.<\/p>\n<p>  \u042d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u043d\u0435\u0435, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0434\u043e\u043f\u0438\u0448\u0435\u043c \u043c\u0435\u0442\u043e\u0434 <code>BuildMatrix<\/code>.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u044b \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u0435\u0442\u0435 \u0437\u0438\u0433\u0437\u0430\u0433-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u0432\u0438\u0434:<\/p>\n<pre><code class=\"plaintext\">[[ 0,  1,  5,  6, 14, 15, 27, 28], [ 2,  4,  7, 13, 16, 26, 29, 42], [ 3,  8, 12, 17, 25, 30, 41, 43], [20, 22, 33, 38, 46, 51, 55, 60], [21, 34, 37, 47, 50, 56, 59, 61], [35, 36, 48, 49, 57, 58, 62, 63], [ 9, 11, 18, 24, 31, 40, 44, 53], [10, 19, 23, 32, 39, 45, 52, 54]] <\/code><\/pre>\n<p>  \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u0442\u0430\u043a\u043e\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 (\u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b):<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/5a6\/245\/3bd\/5a62453bd85d37b80e6c64018e257e14.png\"><\/div>\n<p>  \u0410 \u0435\u0441\u043b\u0438 \u043d\u0430\u0431\u0435\u0440\u0451\u0442\u0435\u0441\u044c \u0445\u0440\u0430\u0431\u0440\u043e\u0441\u0442\u0438, \u0442\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u0435\u0449\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0438\u0433\u0437\u0430\u0433-\u0442\u0430\u0431\u043b\u0438\u0446\u0443:<\/p>\n<pre><code class=\"plaintext\">[[12, 19, 26, 33, 40, 48, 41, 34,], [27, 20, 13,  6,  7, 14, 21, 28,], [ 0,  1,  8, 16,  9,  2,  3, 10,], [17, 24, 32, 25, 18, 11,  4,  5,], [35, 42, 49, 56, 57, 50, 43, 36,], [29, 22, 15, 23, 30, 37, 44, 51,], [58, 59, 52, 45, 38, 31, 39, 46,], [53, 60, 61, 54, 47, 55, 62, 63]] <\/code><\/pre>\n<p>  \u0422\u043e\u0433\u0434\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u0438\u043c:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/f89\/c8f\/081\/f89c8f0819e209c2b0284d20ce670740.png\"><\/div>\n<p>  \u0417\u0430\u0432\u0435\u0440\u0448\u0438\u043c \u043d\u0430\u0448 \u043c\u0435\u0442\u043e\u0434 <code>BuildMatrix<\/code>:<\/p>\n<pre><code class=\"plaintext\">def DecodeNumber(code, bits):     l = 2**(code-1)     if bits&gt;=l:         return bits     else:         return bits-(2*l-1)               class JPEG:     # -----     def BuildMatrix(self, st, idx, quant, olddccoeff):         i = IDCT()          code = self.huffman_tables[0 + idx].GetCode(st)         bits = st.GetBitN(code)         dccoeff = DecodeNumber(code, bits) + olddccoeff          i.base[0] = (dccoeff) * quant[0]         l = 1         while l &lt; 64:             code = self.huffman_tables[16 + idx].GetCode(st)             if code == 0:                 break              # The first part of the AC quantization table             # is the number of leading zeros             if code &gt; 15:                 l += code &gt;&gt; 4                 code = code &amp; 0x0F              bits = st.GetBitN(code)              if l &lt; 64:                 coeff = DecodeNumber(code, bits)                 i.base[l] = coeff * quant[l]                 l += 1          i.rearrange_using_zigzag()         i.perform_IDCT()          return i, dccoeff <\/code><\/pre>\n<p>  \u041c\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u0430 \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0438\u0441\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043a\u043e\u0441\u0438\u043d\u0443\u0441\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 (<code>IDCT()<\/code>). \u0417\u0430\u0442\u0435\u043c \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0431\u0438\u0442\u043e\u0432\u044b\u0439 \u043f\u043e\u0442\u043e\u043a \u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0425\u0430\u0444\u0444\u043c\u0430\u043d\u0430.<\/p>\n<p>  <code>self.huffman_tables[0]<\/code> \u0438 <code>self.huffman_tables[1]<\/code> \u0441\u0441\u044b\u043b\u0430\u044e\u0442\u0441\u044f \u043d\u0430 DC-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0434\u043b\u044f \u044f\u0440\u043a\u043e\u0441\u0442\u0438 \u0438 \u0445\u0440\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0430 <code>self.huffman_tables[16]<\/code> \u0438 <code>self.huffman_tables[17]<\/code> \u0441\u0441\u044b\u043b\u0430\u044e\u0442\u0441\u044f \u043d\u0430 AC-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0434\u043b\u044f \u044f\u0440\u043a\u043e\u0441\u0442\u0438 \u0438 \u0445\u0440\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e.<\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0438\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u043c\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>DecodeNumber <\/code>\u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 <strong>\u0434\u0435\u043b\u044c\u0442\u0430-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439<\/strong> DC-\u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a \u043d\u0435\u043c\u0443 <code>olddccoefficient<\/code>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c <strong>\u0434\u0435\u043b\u044c\u0442\u0430-\u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439<\/strong> DC-\u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442.<\/p>\n<p>  \u0417\u0430\u0442\u0435\u043c \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u043c \u0442\u0443 \u0436\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 AC-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0432 \u043c\u0430\u0442\u0440\u0438\u0446\u0435 \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0438\u044f. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 <code>0<\/code> \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u044b \u0434\u043e\u0448\u043b\u0438 \u0434\u043e \u043c\u0430\u0440\u043a\u0435\u0440\u0430 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u0431\u043b\u043e\u043a\u0430 (End of Block, EOB) \u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f. \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u043f\u0435\u0440\u0432\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0410\u0421-\u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043a\u0432\u0430\u043d\u0442\u043e\u0432\u0430\u043d\u0438\u044f \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043d\u0430\u043c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443 \u043d\u0430\u0441 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0443\u043b\u0435\u0439. \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c \u043f\u0440\u043e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u0438\u043d \u0441\u0435\u0440\u0438\u0439. \u041e\u0431\u0440\u0430\u0442\u0438\u043c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u0441\u043f\u044f\u0442\u044c \u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u043c \u0432\u0441\u0435 \u044d\u0442\u0438 \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u0431\u0438\u0442\u044b. \u0412 \u043a\u043b\u0430\u0441\u0441\u0435 <code>IDCT<\/code> \u0438\u043c \u044f\u0432\u043d\u043e \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0443\u043b\u0438.<\/p>\n<p>  \u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u0432 DC- \u0438 \u0410\u0421-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f MCU, \u043c\u044b \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c MCU \u0438 \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0437\u0438\u0433\u0437\u0430\u0433-\u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0432\u044b\u0437\u0432\u0430\u0432 <code>rearrange_using_zigzag<\/code>. \u0410 \u0437\u0430\u0442\u0435\u043c \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0414\u041a\u041f \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c MCU.<\/p>\n<p>  \u041c\u0435\u0442\u043e\u0434 <code>BuildMatrix<\/code> \u0432\u0435\u0440\u043d\u0451\u0442 \u0438\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0414\u041a\u041f-\u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 DC-\u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u0430. \u041f\u043e\u043c\u043d\u0438\u0442\u0435, \u0447\u0442\u043e \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0439 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0435\u0434\u0438\u043d\u0438\u0446\u044b \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 8&#215;8. \u041f\u0440\u043e\u0434\u0435\u043b\u0430\u0435\u043c \u044d\u0442\u043e \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 MCU \u043d\u0430\u0448\u0435\u0433\u043e \u0444\u0430\u0439\u043b\u0430.<\/p>\n<h3>\u0412\u044b\u0432\u043e\u0434 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d<\/h3>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0448 \u043a\u043e\u0434 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <code>StartOfScan<\/code> \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b Tkinter Canvas \u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u043b \u043a\u0430\u0436\u0434\u044b\u0439 MCU \u043f\u043e\u0441\u043b\u0435 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<pre><code class=\"plaintext\">def Clamp(col):     col = 255 if col&gt;255 else col     col = 0 if col&lt;0 else col     return  int(col)  def ColorConversion(Y, Cr, Cb):     R = Cr*(2-2*.299) + Y     B = Cb*(2-2*.114) + Y     G = (Y - .114*B - .299*R)\/.587     return (Clamp(R+128),Clamp(G+128),Clamp(B+128) )    def DrawMatrix(x, y, matL, matCb, matCr):     for yy in range(8):         for xx in range(8):             c = &quot;#%02x%02x%02x&quot; % ColorConversion(                 matL[yy][xx], matCb[yy][xx], matCr[yy][xx]             )             x1, y1 = (x * 8 + xx) * 2, (y * 8 + yy) * 2             x2, y2 = (x * 8 + (xx + 1)) * 2, (y * 8 + (yy + 1)) * 2             w.create_rectangle(x1, y1, x2, y2, fill=c, outline=c)  class JPEG:     # -----     def StartOfScan(self, data, hdrlen):         data,lenchunk = RemoveFF00(data[hdrlen:])         st = Stream(data)         oldlumdccoeff, oldCbdccoeff, oldCrdccoeff = 0, 0, 0         for y in range(self.height\/\/8):             for x in range(self.width\/\/8):                 matL, oldlumdccoeff = self.BuildMatrix(st,0, self.quant[self.quantMapping[0]], oldlumdccoeff)                 matCr, oldCrdccoeff = self.BuildMatrix(st,1, self.quant[self.quantMapping[1]], oldCrdccoeff)                 matCb, oldCbdccoeff = self.BuildMatrix(st,1, self.quant[self.quantMapping[2]], oldCbdccoeff)                 DrawMatrix(x, y, matL.base, matCb.base, matCr.base )                      return lenchunk+hdrlen         if __name__ == &quot;__main__&quot;:     from tkinter import *     master = Tk()     w = Canvas(master, width=1600, height=600)     w.pack()     img = JPEG('profile.jpg')     img.decode()         mainloop() <\/code><\/pre>\n<p>  \u041d\u0430\u0447\u043d\u0451\u043c \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 <code>ColorConversion<\/code> \u0438 <code>Clamp<\/code>. <code>ColorConversion<\/code> \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f Y, Cr \u0438 Cb, \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0438\u0445 \u043f\u043e \u0444\u043e\u0440\u043c\u0443\u043b\u0435 \u0432 RGB-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u0434\u0430\u0451\u0442 \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 RGB-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043f\u0440\u043e\u0441\u0438\u0442\u044c, \u0437\u0430\u0447\u0435\u043c \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043a \u043d\u0438\u043c 128? \u041a\u0430\u043a \u0432\u044b \u043f\u043e\u043c\u043d\u0438\u0442\u0435, \u0434\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 JPEG \u043a MCU \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0414\u041a\u041f \u0438 \u0432\u044b\u0447\u0438\u0442\u0430\u0435\u0442 128 \u0438\u0437 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0446\u0432\u0435\u0442\u043e\u0432. \u0415\u0441\u043b\u0438 \u0446\u0432\u0435\u0442\u0430 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0431\u044b\u043b\u0438 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 [0,255], JPEG \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u0442 \u0438\u0445 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [-128,+128]. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u043a\u0430\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u044d\u0444\u0444\u0435\u043a\u0442 \u043f\u0440\u0438 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u0438 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0438\u0431\u0430\u0432\u043b\u044f\u0435\u043c 128 \u043a RGB. \u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f <code>Clamp<\/code>, \u0442\u043e \u043f\u0440\u0438 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u0432\u044b\u0445\u043e\u0434\u0438\u0442\u044c \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b [0,255], \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c \u0438\u0445 \u0432 \u044d\u0442\u043e\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 [0,255].<\/p>\n<p>  \u0412 \u043c\u0435\u0442\u043e\u0434\u0435 <code>DrawMatrix<\/code> \u043c\u044b \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043c \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u0439 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u0435 8\u04458 \u0434\u043b\u044f Y, Cr \u0438 Cb, \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0432 RGB-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u044b \u0440\u0438\u0441\u0443\u0435\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u043d\u0430 Tkinter <code>canvas<\/code> \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 <code>create_rectangle<\/code>. \u0412\u0435\u0441\u044c \u043a\u043e\u0434 \u0432\u044b \u043d\u0430\u0439\u0434\u0451\u0442\u0435 \u043d\u0430 <a href=\"https:\/\/github.com\/yasoob\/Baseline-JPEG-Decoder\">GitHub<\/a>. \u0415\u0441\u043b\u0438 \u0435\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c, \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043c\u043e\u0451 \u043b\u0438\u0446\u043e.<\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>  \u041a\u0442\u043e \u0431\u044b \u043c\u043e\u0433 \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0434\u043b\u044f \u043f\u043e\u043a\u0430\u0437\u0430 \u043c\u043e\u0435\u0433\u043e \u043b\u0438\u0446\u0430 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c 6000 \u0441\u043b\u043e\u0432. \u0423\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u043c\u043d\u044b \u0431\u044b\u043b\u0438 \u0430\u0432\u0442\u043e\u0440\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432! \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0432\u0430\u043c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0430\u0441\u044c \u0441\u0442\u0430\u0442\u044c\u044f. \u042f \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e\u043c\u0443 \u043d\u0430\u0443\u0447\u0438\u043b\u0441\u044f, \u043f\u043e\u043a\u0430 \u043f\u0438\u0441\u0430\u043b \u044d\u0442\u043e\u0442 \u0434\u0435\u043a\u043e\u0434\u0435\u0440. \u041d\u0435 \u0434\u0443\u043c\u0430\u043b, \u0447\u0442\u043e \u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e JPEG-\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438. \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0435\u043a\u043e\u0434\u0435\u0440 \u0434\u043b\u044f PNG (\u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430).<\/p>\n<h2>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b<\/h2>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438, \u043f\u043e\u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0441\u0442\u0430\u0442\u044c\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043a\u043e\u0435-\u043a\u0430\u043a\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u044b:<\/p>\n<ul>\n<li><a href=\"https:\/\/parametric.press\/issue-01\/unraveling-the-jpeg\/\">\u0418\u043b\u043b\u044e\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u0440\u0430\u0441\u043f\u0443\u0442\u044b\u0432\u0430\u043d\u0438\u044e JPEG<\/a><\/li>\n<li><a href=\"https:\/\/www.impulseadventure.com\/photo\/jpeg-huffman-coding.html\">\u041e\u0447\u0435\u043d\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0425\u0430\u0444\u0444\u043c\u0430\u043d\u0430 \u0432 JPEG<\/a><\/li>\n<li><a href=\"https:\/\/koushtav.me\/jpeg\/tutorial\/c++\/decoder\/2019\/03\/02\/lets-write-a-simple-jpeg-library-part-2\/\">\u041f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0443\u044e JPEG\u2014\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u043d\u0430 C++<\/a><\/li>\n<li><a href=\"https:\/\/docs.python.org\/3\/library\/struct.html\">\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0434\u043b\u044f struct \u0432 Python 3<\/a><\/li>\n<li><a href=\"https:\/\/engineering.fb.com\/android\/the-technology-behind-preview-photos\/\">\u041a\u0430\u043a FB \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0437\u043d\u0430\u043d\u0438\u0435\u043c \u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f JPEG<\/a><\/li>\n<li><a href=\"http:\/\/vip.sugovica.hu\/Sardi\/kepnezo\/JPEG%20File%20Layout%20and%20Format.htm\">\u0421\u0445\u0435\u043c\u0430 \u0438 \u0444\u043e\u0440\u043c\u0430\u0442 JPEG-\u0444\u0430\u0439\u043b\u0430<\/a><\/li>\n<li><a href=\"https:\/\/dfrws.org\/sites\/default\/files\/session-files\/pres-using_jpeg_quantization_tables_to_identify_imagery_processed_by_software.pdf\">\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u043f\u0440\u0435\u0437\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u041c\u0438\u043d\u0438\u0441\u0442\u0435\u0440\u0441\u0442\u0432\u0430 \u043e\u0431\u043e\u0440\u043e\u043d\u044b \u043e JPEG-\u043a\u0440\u0438\u043c\u0438\u043d\u0430\u043b\u0438\u0441\u0442\u0438\u043a\u0435<\/a><\/li>\n<\/ul>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/512004\/\"> https:\/\/habr.com\/ru\/company\/mailru\/blog\/512004\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/mailru\/blog\/512004\/\">\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/9p\/8u\/z0\/9p8uz00vyiu_gcooou6mjpi6tcg.jpeg\" width=\"400\"><\/div>\n<p>  \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442, \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u0441\u0436\u0430\u0442\u0438\u044f JPEG. \u041c\u043d\u043e\u0433\u0438\u0435 \u043d\u0435 \u0437\u043d\u0430\u044e\u0442, \u0447\u0442\u043e JPEG \u2014 \u044d\u0442\u043e \u043d\u0435 \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0444\u043e\u0440\u043c\u0430\u0442, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e JPEG-\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b \u0432\u0438\u0434\u0438\u0442\u0435, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 JFIF (JPEG File Interchange Format), \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u0436\u0430\u0442\u0438\u044f JPEG. \u041a \u043a\u043e\u043d\u0446\u0443 \u0441\u0442\u0430\u0442\u044c\u0438 \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u043a\u0430\u043a \u044d\u0442\u043e\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0441\u0436\u0438\u043c\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043a\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0438 \u043d\u0430 Python. \u041c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043d\u044e\u0430\u043d\u0441\u044b \u0444\u043e\u0440\u043c\u0430\u0442\u0430 JPEG (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u043e\u0435 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435), \u0430 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u0430, \u043f\u043e\u043a\u0430 \u0431\u0443\u0434\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0434\u0435\u043a\u043e\u0434\u0435\u0440.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-307331","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/307331","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=307331"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/307331\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=307331"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=307331"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=307331"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}