Ihdr: PNG — not GIF! / Хабр

Содержание

PNG — not GIF! / Хабр

Доброго времени суток!
Вам когда-нибудь хотелось узнать как устроены файлы PNG? Нет? А я все равно расскажу.
Формат PNG(Portable Network Graphics) был изобретен в 1995 году, чтобы стать заменой GIF, а уже в 1996, с выходом версии 1.0, он был рекомендован W3C, в качестве полноправного сетевого формата. На сегодняшний день PNG является одним из основных форматов веб-графики.

Под катом вы найдете общее описание строения PNG-файла, некоторое количество картинок-схем, препарирование в hex-редакторе, и, конечно, ссылку на спецификацию.
Общее строение

Структура PNG в самом общем виде представлена на следующем рисунке.

То есть файл состоит из подписи и некоторого количества блоков(чанков, chunks), каждый из которых несет в себе некоторую информацию (спасибо КО!). Но почему подпись нельзя считать одним из чанков? Давайте разберемся поподробнее.
Подпись файла

Подпись PNG-файла всегда одинакова, состоит из 8 байт, и представляет собой (в hex-записи)
89 50 4E 47 0D 0A 1A 0A

Что же это означает?
  • 89 — non-ASCII символ. Препятствует распознаванию PNG, как текстового файла, и наоборот.
  • 50 4E 47 — PNG в ASCII записи.
  • 0D 0A — CRLF (Carriage-return, Line-feed), DOS-style перевод строки.
  • 1A — останавливает вывод файла в DOS режиме (end-of-file), чтобы вам не вываливалось многокилобайтное изображение в текстовом виде.
  • 0A — LF, Unix-style перевод строки.
Chunks

Чанки — это блоки данных, из которых состоит файл. Каждый чанк состоит из 4 секций.

Разберем эти секции по порядку.
Длина

Ну, с длиной вроде все ясно. Просто числовое значение длины блока данных.
Тип (имя)

С типом немного поинтересней. Тип представляет собой 4 чувствительных к регистру ASCII-символа. Регистры символов (пятый бит в числовой записи символа) в имени чанка различаются неспроста — это флаги, которые сообщают декодеру некоторую дополнительную информацию.
  • Регистр первого символа определяет является ли данный чанк критическим(верхний регистр) или вспомогательным(нижний регистр). Критические чанки должны распознаваться каждым декодером. Если декодер встречает критический чанк, тип которого не может распознать, он обязан завершить выполнение с ошибкой.
  • Регистр второго символа задает «публичность»(верхний регистр) или «приватность»(нижний регистр) чанка. «Публичные» чанки — официальные, задокументированные, распознаваемые большинством декодеров. Но если вдруг вам для каких-то своих нужд понадобится кодировать специфическую информацию, то просто в имени чанка сделайте второй символ маленьким.
  • Регистр третьего символа оставлен для будущих свершений. Предполагается, что он будет использоваться для дифференциации различных версий стандарта. Для версий 1.0 и 1.1 третий символ должен быть большим. Если он (внезапно!) оказался маленьким, все нынешние декодеры должны поступать с чанком, так же как и с любым другим не распознанным (то есть выходить с ошибкой если чанк критический, или пропускать в противном случае).
  • Регистр же четвертого символа означает возможность копирования данного чанка редакторами, которые не могут его распознать. Если регистр нижний, чанк может быть скопирован, вне зависимости от степени модификации файла, иначе (верхний регистр) он копируется только в случае, когда при модификации не были затронуты никакие критические чанки.

Для лучшего понимания, давайте разберем флаги на примере чанка, содержащего текст.

Ниже приведен список типов чанков с краткими пояснениями.
Критические чанки

  • IHDR — заголовок файла, содержит основную информацию о изображении. Обязан быть первым чанком.
  • PLTE — палитра, список цветов.
  • IDAT — содержит, собственно, изображение. Рисунок можно разбить на несколько IDAT чанков, для потоковой передачи. В каждом файле должен быть хотя бы один IDAT чанк.
  • IEND — завершающий чанк, обязан быть последним в файле.

Вспомогательные чанки

  • bKGD — этот чанк задает основной фоновый цвет.
  • cHRM используется для задания CIE 1931 цветового пространства.
  • gAMA — определяет гамму.
  • hIST — в этом чанке может храниться гистограмма или общее содержание каждого цвета в изображении.
  • iCCP — цветовой профиль ICC
  • iTXt — содержит текст в UTF-8, возможно сжатый, с необязательной языковой меткой. iTXt чанк с ключевым словом 'XML:com.adobe.xmp' может содержать Extensible Metadata Platform (XMP).
  • pHYs — содержит предполагаемый размер пикселя и/или отношение сторон изображения.
  • sBIT (significant bits) — определяет «цветовую точность» (color-accuracy) изображения (черно-белое, полный цвет, черно-белое с прозрачностью и т.д.), для более простого декодирования.
  • sPLT — предлагает палитру для использования, если полный спектр цветов недоступен.
  • sRGB — свидетельствует о использовании стандартной sRGB схемы.
  • sTER — индикатор стереоскопических изображений.
  • tEXt — может содержать текст в ISO/IEC 8859-1 формате, с одной name=value парой для каждого чанка.
  • tIME — хранит дату последнего изменения изображения.
  • tRNS — содержит информацию о прозрачности.
  • zTXt — сжатый текст, с теми же ограничениям, что и tEXt.

Более подробную информацию можно найти в спецификации.
CRC

Контрольная сумма CRC-32. Кстати на днях был топик о ее подсчете в Windows.
Минимальный PNG

С общей структурой разобрались. Теперь разберем содержание обязательных чанков. Но какие из них обязательные (не критические, критические обязаны распознаваться декодером, а не присутствовать в каждом файле), и как выглядит минимальный PNG-файл? А вот как:
IHDR

Блок данных в IHDR содержит следующие поля:
  • Ширина, 4 байта
  • Высота, 4 байта
  • Битовая глубина (bit depth), определяет количество бит на каждый сэмпл(не пиксель), 1 байт
  • Тип цвета, состоит из 3 флагов 1 (используется палитра), 2 (используется цвет, не монохромное изображение), and 4 (присутствует альфа-канал), 1 байт
  • Метод сжатия. На данный момент доступно только значение 0 — сжатие по алгоритму deflate. Если значение отлично от 0, чанк считается нераспознанным, и декодер рапортует об ошибке. 1 байт
  • Метод фильтрации. Так же, как и в случае сжатия, на данный момент может быть только нулем. 1 байт
  • Interlace(переплетение) метод. Определяет порядок передачи данных. На данный момент доступно 2 значения: 0 (no interlace) и 1 (Adam7 interlace). 1 байт

Adam7 interlacing прекрасно демонстрирует картинка из википедии (да-да, GIF в статье про PNG):
IEND

Сигнализирует о конце файла, блок данных этого чанка не содержит ничего.
IDAT

Содержит данные, закодированные, в соответствии с полем метода сжатия в заголовке. Алгоритм декодирования выходит за рамки данной статьи (однако если будут желающие, может появиться в следующей), но в довольно хорошо (и по-русски) описан здесь.

Таким образом, простейший PNG-файл (на примере ) выглядит следующим образом.

Заключение

При написании данной статьи я ставил своей задачей дать читателю общие знания о строении PNG-файла, для более глубокого понимания рекомендуется читать спецификации.

Топик на хабре про строение JPEG: habrahabr.ru/blogs/algorithm/102521
Топик на хабре про строение GIF: habrahabr.ru/blogs/algorithm/127083

Спасибо за внимание, буду рад любой критике!

Структура PNG-файла: основные и вспомогательные фрагменты (chunks): nabbla1 — LiveJournal
После написания PNGRepack у меня появился спортивный интерес - просмотреть все файлы PNG на своём компьютере и выяснить, чего интересненького в них напихано кроме непосредственно изображений?

PNGRepack_chunk_options.png

Впрочем, интерес не только спортивный - до сих пор PNGRepack относилась к не относящимся к делу фрагментам очень лояльно - записывала их в преобразованный файл, как ни в чем не бывало, хотя от многих из них вполне можно избавиться, а другие, напротив надо нежить, холить и лелеять, и вообще при обработке изображений обращать на них пристальное внимание.

Сегодня про общую структуру и про фрагменты tEXt, zTXt, iTXt, tIME, pHYs и gAMA.

До сих пор не знаю, как слово chunk правильно перевести на русский, пущай будет фрагмент. Каждый фрагмент начинается с 4-х байт длины, затем название из 4-х латинских букв, затем непосредственно данные, а в конце - 4-байтная контрольная сумма CRC. Из того, как построено название, уже можно много почерпнуть.

Если первая буква заглавная, значит фрагмент "критический", т.е считается, что без него изображение не удастся посмотреть ни в каком виде, и если хоть один из критических фрагментов отсутствует, декодер должен грязно выругаться. Критических фрагментов сейчас 4: IHDR (Image Header), PLTE (Palette), IDAT (Image Data) и IEND (Image End). Уже здесь возникает неоднозначность - палитра критически важна только для изображений, у которых ColorType = COLOR_PALETTE, для остальных она допустима (правильный декодер должен попытаться ей воспользоваться, если монитор может отображать одновременно лишь ограниченное число цветов), но как правило отсутствует.

Соответственно, строчная буква означает, что фрагмент "вспомогательный" (Ancillary), т.е что-то похожее отобразится и если их проигнорировать, но зачем-то их все-таки запихнули, наверное, не зря.

Если последняя буква у вспомогательного фрагмента заглавная, значит, что при изменении самого изображения они тоже, возможно, должны определенным образом измениться, поскольку зависят от этого изображения, например, tRNS (transparency) отвечает за "простую прозрачность" (cheap transparency), когда либо один из цветов назначается прозрачным, он-то и записан в tRNS, либо нескольким первым цветам палитры приписываются значения прозрачности. Если какое-то приложение открыло tRNS, ничего не зная о том, что это за зверь, а потом после работы с изображением перемешало палитру, то ничего хорошего не выйдет, и считается лучшим выходом либо вообще выкинуть tRNS после такого издевательства, либо и вовсе не браться за редактирование изображения, если в нем есть такие вспомогательные фрагменты с заглавной последней буквой. Впрочем, это правило мало кто соблюдает, да и расплывчатое оно. Почему gAMA (значение гамма-коррекции) так уж зависит от самой картинки - мне непонятно. Собственно, строчная последняя буква есть только у текстовых фрагментов и у pHYs (pHysical size), хранящего разрешение картинки при сканировании, скажем, 600 dpi.

И наконец, вторая буква названия фрагмента заглавная, если он "публичный", т.е утвержден высочайшим советом и входит в спецификацию, и строчная, если он "частный", таковые тоже существуют, но известно о них немного. Скажем, Adobe Fireworks использовала формат PNG в качестве базового, но добавила туда свои собственные фрагменты mkBS, mkTS, mkBF, prVW и др., чтобы хранить что-то вроде слоёв и векторов, чтобы можно было сохранить проект в PNG, а позже открыть его и продолжить работать как ни в чем ни бывало. О том, как они устроены, Adobe не распространяется. На эти штуки я натыкался, они могут занимать приличные объемы, и если мы не собираемся редактировать эту картинку в Fireworks, их следует удалить.


(что такое FACECAFE - не знаю. Похоже на рекламный слоган: "Хороший mkBT начинается с FACECAFE")

Теперь рассмотрим, наконец, фрагмент каждого типа подробнее.

Текстовые фрагменты (tEXt, zTXt, iTXt)
Произвольный текст, добавленный к изображению. Например, таким образом можно записать EXIF, хотя фотографии обычно все-таки хранятся в JPG. tEXt - самый простой, несжатый текст, каждый фрагмент содержит название (keyword) и непосредственно текст. zTXt (zipped text) - то же самое, только текст сжат тем же самым zlib (оставлена возможность под другие форматы сжатия, но пока доступен только CompressionMethod=0, что означает zlib), а iTXt (international text) имеет кодировку не Latin-1, как два предыдущих, а UTF-8, причем текст может быть сжатым, а может и нет, а кроме Keyword добавляются еще поля Language и Translated keyword.
Concrete.png
(Пожалуй, самое нетривиальное, что встретилось мне в текстовых полях)

Для Keyword определены стандартные значения Title, Author, Description, Copyright, Creation Time, Software, Disclaimer, Warning, Source, Comment, но можно использовать и любые другие.

Ничего особенно интересного в этих полях я не находил, чаще других попадается Software - многие графические редакторы заполняют его своим названием, это продукты Adobe, Gimp, Paint.net и другие. Чрезвычайно бесят пустые поля, когда у изображения целый набор этих текстовых фрагментов - Title, Author, Description, но текст у них вообще отсутствует. В PNGRepack добавлена галочка удалять такие пустые поля без лишних вопросов.
tEXt_software.png
StupidBlankItxt.png

Метка времени tIME
В стандарте сказано, что это должно быть время последнего изменения изображения, оттого последняя буква заглавная (отредактировал изображение - будь добр и время переписать!). Довольно скучная вещь, но может пригодиться.
tIME.png

Физические размеры пикселя (разрешение) pHYs
Совсем короткий фрагмент, но очень важный при обработке сканов - многие программы этого толка отталкиваются не от размера изображения в пикселях, а от физического размера бумаги, чтобы обложка в 600 dpi и последующие страницы в 300 dpi в итоге отображались бы в одном масштабе. Как правило, в pHYs записывается горизонтальное и вертикальное разрешение в пикселях на метр, которые легко пересчитать в пиксели на дюйм.
PNGRepackPHYS.png

Возможен вариант, когда единица измерения не указана, тогда узнать реальное разрешение нельзя, только "соотношение сторон пикселя" - такой информацией было бы полезно снабдить кадр анаморфного видео, чтобы можно было корректно отобразить его на экране. Создатели формата рекомендуют проверять, являются ли пиксели "квадратными" у изображения и растягивать его в нужную сторону, если нет, чтобы не получить вытянутые морды. Пока ни одного изображения с "безразмерным" разрешением мне не встретилось.

Снова видим эфемерность регистра последней буквы - тут она строчная, но очевидно же, что при масштабировании изображения нам придется поменять и физическое разрешение. Не удивлюсь, если создатели формата кидали монетку, чтобы определить, где буква будет заглавной, а где строчной.

Гамма-коррекция gAMA
Самый неоднозначный фрагмент. Задумка была хорошая - на разных операционных системах свои соглашения, с какой гаммой показывать изображения, соответственно, (128,128,128) может означать немножко разный цвет, и почти никогда это не будет 50% серый, который ближе к (192,192,192), в общем, хотелось авторам навести некоторый порядок, но почему-то, вместо того, чтобы обозначить, как закодирована яркость в изображении (1 означало бы, что линейно, а число отличное от 1 - наличие степенной зависимости), они постановили, что гамма будет говорить просмотрщику, в какой мере надо еще преобразовать эти пиксели, прежде чем в линейном виде подать на монитор! Это привело к большой путанице, и я не уверен, что хоть где-то её обработка сделана корректно. Вот те немногие гаммы, что я находил в изображениях:
AnotherStupidGamma.png
PNGRepackStupidGamma.png
Кажется, вот оно, корректное применение - мы предупреждаем просмотрщик, что вместо стандартной для sRGB гаммы в 2.2 мы задаем 2.4, и просмотрщик теперь чуть-чуть подкорректирует значения и получит качественную картинку. НЕ ТУТ-ТО БЫЛО!!! Согласно спецификации, в gAMA должно заносится значение, обратное гамме, в данном случае 1/2.4 = 0.42. То, что программы продолжают беспалевно сохранять сюда саму гамму вместо обратной величины, и никто этого не заметил - дурной признак.

Продолжение следует.

Структура PNG | LAMPCORE

Написать комментарий

Все операции будем проводить при помощи шестнадцатеричного HEX-редактора Translhextion

Скачать( внутри справка в формате .chm и шрифт в .ttf):

Translhextion_LampCore_Ru

Открываем Translhextion, перетягиваем в окно изображение формата png, рассматриваем байты.

PNG(сокращение  от Portable Graphic Network) — это растровое изображение, которое имеет следующую структуру:

 

Первые 8 байт это сигнатура PNG, всегда одна и та же:

89 50 4E 47 0D 0A 1A 0A

Первый байт 89 — идентификация типа файла, для систем,  где ожидается, что первые два байта будут идентифицировать тип файла. Первый байт выбирается не как ASCII-символ для того, чтобы файл не был распознан как текст, также это исправляет плохую передачу файла, которая очищает 7-ой бит.

Второй, третий и четвертый 50 4E 47 — PNG в текстовом формате ASCII

Пятый, шестой 0D 0A — конец строки и перевод(DOS, CR+LF)

Седьмой 1A — EOF, End Of Fil, конец файла (DOS)

Восьмой байт 0A — LF, перевод строки(Unix)

 

После идут несколько обязательных  фрагментов(chunks), блоков с данными — IHDR, IDAT, IEND

Пример первых 8-ми байт блока IHDR:

00 00 00 0D 49 48 44 52 

Первые 4 байта фрагмента это размер фрагмента:

00 00 00 0D — размер 13 байт.

После идет тип(имя) фрагмента:

49 48 44 52 — IHDR в ASCII

Далее после имени фрагмента, идет его описание:

IHDR состоит из 13 байт, пример:

00 00 00 80  00 00 00 7F 08 03 00 00 00

Первые 4 байта — 00 00 00 80 это ширина изображения, в десятичной системе 128

Вторые 4 байта — 00 00 00 7F это высота изображения, в десятичной системе 127

Девятый байт — 08 количество бит, соответственно изображение 8-ми битное

Десятый байт — 03 тип цвета, имеет три варианта:

1 — Используется палитра

2 — Цветное изображение, не монохромное

3 — Альфа канал

Так как у нас изображение имеет прозрачность, то стоит байт 03

Одиннадцатый байт — 00 метод сжатия, всегда 0

Двенадцатый байт — 00 метод фильтрации, всегда 0

Тринадцатый и последний байт IHDR — 00 переплетение(interlace), 00 — нет переплетения, 01 — переплетение Adam7

Последние 4 байта фрагмента — это контрольная сумма CRC32, рассчитывается, исходя из  предыдущих байт фрагмента, байты для расчета, включают имя фрагмента и  его данные, но не включают поле длины фрагмента!То есть для расчета берутся байты 49 48 44 52 00 00 00 80  00 00 00 7F 08 03 00 00 00

 

На данный момент имеем:

89 50 4E 47 0D 0A 1A 0A — сигнатура PNG

00 00 00 0D 49 48 44 52  — Длина и описание блока данных(IHDR)

00 00 00 80  00 00 00 7F 08 03 00 00 00 — Значения полей блока данных IHDR

10 24 3A 35 — Контрольная сумма CRC32 блока данных IHDR

 

В итоге начало файла выглядит так:

89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52  00 00 00 80  00 00 00 7F 08 03 00 00 00  10 24 3A 35

 

 

 

IDAT — содержит данные самого изображения

 

IEND — говорит о конце файла, не имеет полей, значение фиксировано:

49 45 4E 44 AE 42 60 82

В текстовом представлении выглядит как —  » IEND®B`‚»

ОЦЕНИТЕ ДАННУЮ ПУБЛИКАЦИЮ:

Отправить рейтинг

Средний рейтинг / 5. Количество оценок:

Мы сожалеем, что эта публикация Вас не устроила.

Напишите, пожалуйста, что Вам конкретно не понравилось, как можно улучшить статью?(оценка будет засчитана только при наличии отзыва)

Отправить отзыв

Спасибо за ваш отзыв!

📋 Как просмотреть метаданные изображения в Linux — Information Security Squad

Метаданные изображения — это набор информации об изображениях.

Метаданные либо встраиваются в само изображение, либо хранятся в отдельном файле.

Существует три типа метаданных, а именно:

  • Технические метаданные,
  • Описательные метаданные,
  • Административные метаданные.

Как следует из названия, технические метаданные обычно включают техническую информацию об изображении, такую ​​как детали камеры, DPI, выдержка, размер файла, формат изображения, дата и время захвата или создания изображения, программное обеспечение, используемое для создания изображения. изображение и несколько других деталей.

👨⚕️️ Как узнать, откуда был скачан файл в командной строке Linux 👨⚕️

Технические метаданные в основном генерируются автоматически устройствами камеры.

Описательные метаданные добавляются фотографом вручную. Владелец (или фотограф) может добавить его вручную, используя любое внешнее программное обеспечение, такое как GIMP или Photoshop. Он включает в себя такую ​​информацию, как название фотографии, местоположение, имя фотографа, комментарии и т. д.

Описательные метаданные очень полезны для простого и быстрого поиска фотографий.

Административные метаданные содержат идентификационные и контактные данные владельца, лицензии, авторских прав и условий использования изображений.

Добавление метаданных к изображениям важно для предотвращения кражи содержимого, неправильного использования и отслеживания использования изображений. Однако метаданные могут быть легко удалены. Надеюсь, вы получите базовое представление о метаданных Image и их типах.

Теперь давайте продолжим и посмотрим, как найти информацию об изображениях из командной строки в Linux.

Просмотр метаданных изображения в Linux

Существует множество инструментов для поиска метаданных изображения в Linux.

Здесь я покажу три инструмента командной строки для просмотра таких деталей.

1. Использование ImageMagick

ImageMagick имеет инструмент командной строки с именем «Identify» для поиска метаданных изображения.

ImageMagick доступен в репозиториях по умолчанию большинства дистрибутивов Linux.

В Arch Linux и его вариантах выполните следующую команду для установки ImageMagick:

$ sudo pacman -S imagemagick

На Debian, Ubuntu, Linux Mint:

$ sudo apt install imagemagick

На Fedora:

$ sudo dnf install imagemagick

На  SUSE/openSUSE:

$ sudo zypper install imagemagick

Теперь давайте найдем метаданные изображения.

Для этого просто запустите:

$ identify -verbose image.png

Эта команда выведет подробный вывод метаданных данного изображения.

Image: image.png
  Format: PNG (Portable Network Graphics)
  Mime type: image/png
  Class: DirectClass
  Geometry: 1366x768+0+0
  Units: Undefined
  Type: TrueColor
  Endianess: Undefined
  Colorspace: sRGB
  Depth: 8-bit
  Channel depth:
    red: 8-bit
    green: 8-bit
    blue: 8-bit
  Channel statistics:
    Pixels: 1049088
    Red:
      min: 0 (0)
      max: 255 (1)
      mean: 158.62 (0.62204)
      standard deviation: 36.8176 (0.144383)
      kurtosis: -0.256842
      skewness: -0.00384146
      entropy: 0.897097
    Green:
      min: 0 (0)
      max: 255 (1)
      mean: 39.1664 (0.153594)
      standard deviation: 30.5192 (0.119683)
      kurtosis: 26.7374
      skewness: 4.16992
      entropy: 0.773393
    Blue:
      min: 0 (0)
      max: 255 (1)
      mean: 48.4269 (0.189909)
      standard deviation: 27.7343 (0.108762)
      kurtosis: 33.5882
      skewness: 4.85108
      entropy: 0.741411
  Image statistics:
    Overall:
      min: 0 (0)
      max: 255 (1)
      mean: 82.0712 (0.321848)
      standard deviation: 31.9173 (0.125166)
      kurtosis: 35.6513
      skewness: 6.83895
      entropy: 0.803967
  Rendering intent: Perceptual
  Gamma: 0.454545
  Chromaticity:
    red primary: (0.64,0.33)
    green primary: (0.3,0.6)
    blue primary: (0.15,0.06)
    white point: (0.3127,0.329)
  Background color: white
  Border color: srgb(223,223,223)
  Matte color: grey74
  Transparent color: black
  Interlace: None
  Intensity: Undefined
  Compose: Over
  Page geometry: 1366x768+0+0
  Dispose: Undefined
  Iterations: 0
  Compression: Zip
  Orientation: Undefined
  Properties:
    date:create: 2019-08-26T19:25:54+06:00
    date:modify: 2019-08-09T13:49:32+05:00
    png:IHDR.bit-depth-orig: 8
    png:IHDR.bit_depth: 8
    png:IHDR.color-type-orig: 2
    png:IHDR.color_type: 2 (Truecolor)
    png:IHDR.interlace_method: 0 (Not interlaced)
    png:IHDR.width,height: 1366, 768
    png:sRGB: intent=0 (Perceptual Intent)
    signature: 6e35d79e6896e49e6256eadeec46b4f6a4951b13e309a9c89d9235ce51a3b541
  Artifacts:
    filename: image.png
    verbose: true
  Tainted: False
  Filesize: 379KB
  Number pixels: 1.049M
  Pixels per second: 26.23MB
  User time: 0.040u
  Elapsed time: 0:01.039
  Version: ImageMagick 6.9.7-4 Q16 x86_64 20170114 http://www.imagemagick.org

Если вам нужны только основные сведения, например, просто удалите опцию -verbose.

$ identify image.png 
image.png PNG 1366x768 1366x768+0+0 8-bit sRGB 379KB 0.000u 0:00.000

Более подробную информацию можно найти на страницах руководства:

2. Используя команду file

Мы можем использовать команду file, которая используется для определения типов файлов, для просмотра метаданных изображения.

$ file image.png 
image.png: PNG image data, 1366 x 768, 8-bit/color RGB, non-interlaced

Команда file не имеет возможности предоставить подробный вывод, такой как команда «identifier».

Она выводит только основные метаданные.

Прочтите справочные страницы, чтобы узнать больше о команде file:

$ man file

3. Использование Exif

Exif — это утилита командной строки для отображения и изменения данных EXIF изображения.

Для тех, кто интересуется, EXIF (расшифровывается как Exchangeable Image File Format), как правило, файл JPEG, записанный на вашем устройстве хранения всякий раз, когда вы делаете фотографию.

С вашего смартфона или камеры.

Данные EXIF включают такие данные, как дата и время фотографий, настройки камеры, геолокация, информация о лицензии и авторских правах и т. д.

Она доступна в репозиториях по умолчанию в Debian и его производных, таких как Ubuntu.

Чтобы просмотреть метаданные изображения с помощью exif, просто запустите:

$ exif image.jpg

Exif выдаст хороший вывод в виде табличного столбца, как показано ниже.

EXIF tags in 'image.jpg' ('Motorola' byte order):
--------------------+----------------------------------------------------------
Tag                 |Value
--------------------+----------------------------------------------------------
Image Description   |Lady Evelyn Falls/Chutes Lady Evelyn, Northwest Territorie
Artist              |J. A. Kraulis
Copyright           |J. A. Kraulis/Masterfile (Photographer) - [None] (Editor)
XP Title            |Lady Evelyn Falls/Chutes Lady Evelyn, Northwest Territorie
XP Author           |J. A. Kraulis
Padding             |2060 bytes undefined data
X-Resolution        |72
Y-Resolution        |72
Resolution Unit     |Inch
Padding             |2060 bytes undefined data
Exif Version        |Exif Version 2.1
FlashPixVersion     |FlashPix Version 1.0
Color Space         |Internal error (unknown value 65535)
--------------------+----------------------------------------------------------

Exif не только читает метаданные, но и записывает EXIF в изображения.

Для получения более подробной информации, проверьте справочные страницы:

Вы можете использовать Фотошоп Онлайн в Linux, чтобы просматривать метаданные изображения и редактировать его.

PNG и APNG — технические детали

В сети мы часто видим высококачественные изображения, с альфа-каналом. Все это, как правило формат PNG (хотя бывает и SVG). Мало кто знает, что он и себя представляет. Сегодня с расскажу про формат PNG подробно.

Начало

Формат PNG состоит из чанков и сигнатуры. Каждый чанк состоит из длины, имени, содержимого и crc32.
Длина — 4 байта
Имя — 4 байта
Данные — X байт
CRC32 — 4 байта

Сигнатура состоит из восьми байтов из стоит всегда в начале файла.
137 80 78 71 13 10 26 10

Чанки

Эти чанки обязательны практически для каждого PNG файла.

IHDR

Цветовой тип, сжатие, чересстрочный ли он, определяется чанком IHDR. Чанк IHDR состоит из:
Ширина — 4 байта
Высота — 4 байта
Глубина цвета — 1 байт
Цветовой тип — 1 байт
Метод сжатия — 1 байт
Фильтр метод — 1 байт
Чересстрочность — 1 байт

IDAT

Об этом чанке я ничего говорить не буду. Этот чанк хранит пиксели в сжатом виде (DEFLATE).

IEND

Самый последний чанк в PNG. Стоит всегда в конце.

PLTE

Палитра для 256 цветного PNG.

tRNS

Определяет, какие цвета должны быть прозрачными. Доступен только для 24-битного PNG (бинарная прозрачность) и 8-битного PNG (каждый цвет в палитре может иметь свой цвет прозрачности).

APNG чанки

Анимированный PNG использует три необязательных чанка.

acTL

Как правило находится после IHDR. Хранит данные количестве кадров и проигрышей. Длина всегда 8 байт.

fdAT

Этот чанк хранит пиксели кадра APNG.
Номер чанка — 4 байта
Сжатые данные — X-4 байта

fcTL

Стоит как правило перед fdAT
4 байта — номер
4 байта — ширина
4 байта — высота
4 байта — позиция X
4 байта — позиция Y
2 байта — задержка (количестве кадров)
2 байта — задержка (количество секунд, если я не ошибаюсь)
1 байт — dispose (не знаю как перевести)
1 байт — смешивание

Советы по APNG

Формат APNG можно разобрать на кадры, основываясь на данных чанков. Каждый кадр имеет общую палитру, общий цветовой тип, общее сжатие. Однако это не один огромный спрайт, как многие могли подумать. Это самостоятельные сжатые данные внутри PNG.

Как достигается обратная совместимость APNG

Обратная совместимость достигается за счет использования необязательных чанков fdAT, fcTL и acTL (в одной статье даже описывалось необязательные и обязательные чанки подробно). Браузер, который не поддерживает APNG, просто игнорирует их. APNG иногда может отказать отображать обязательный IDAT (вместо него первый fdAT). Но браузер, который не поддерживает APNG, все же отображает IDAT.
Объясняется это тем, что такие APNG файлы, перед IDAT не имеют fcTL, из-за чего происходит игнор чанка IDAT браузером, который поддерживает APNG.

Как увидеть чанки PNG

1. Можно открыть PNG файл при помощи TweakPNG
2. Можно открыть любым HEX редактором

Вопрос по Web-программированию — как прочитать PNG данные

Чтобы, к примеру прочитать длину или еще какие-нибудь байты, вам придется использовать DataView на ArrayBuffer — это единственный верный способ. По другому вы не сможете вычитать длину, и прочие данные.

Еще один вопрос — можно ли получить строку из arraybuffer

Нужно получить Uint8Array и каждый элемент массива преобразовать в строку при помощи String.fromCharCode(number).

Автор: Alexei03a

C ++ PNG заголовок неправильно прочитан Длина блока данных IHDR, ширина и высота
Переполнение стека
  1. Товары
  2. Клиенты
  3. Случаи использования
  1. Переполнение стека Публичные вопросы и ответы
  2. Команды Частные вопросы и ответы для вашей команды
  3. предприятие Частные вопросы и ответы для вашего предприятия
  4. работы Программирование и связанные с ним технические возможности карьерного роста
  5. Талант Нанимать технический талант
  6. реклама Связаться с разработчиками по всему миру
,

DMC-G7

% PDF-1.6 % 33066 0 объектов > / Имена 33070 0 R / Outlines 33251 0 R / Метаданные 33063 0 R / Pages 33015 0 R / PageLayout / OneColumn / OpenAction 33067 0 R / Threads 33068 0 R / Тип / Каталог / PageLabels 33013 0 R >> endobj 33070 0 объектов > endobj 33251 0 объектов > endobj 33063 0 объектов > поток 2015-07-02T10: 18: 17 + 08: 00 2015-05-11T15: 35: 41 + 08: 00 2015-07-02T10: 18: 17 + 08: 00 применение / PDF

  • DMC-G7
  • Panasonic Corporation
  • UUID: bd84d734-827c-4f86-B700-eba7f13b16e3 UUID: 6c74bee0-e324-4d42-9882-1acbb9f61dbd endstream endobj 33015 0 объектов > endobj 33067 0 объектов > endobj 33068 0 объектов [33069 0 Р] endobj 33013 0 объектов > endobj 33014 0 объектов > endobj 33069 0 объектов >>> endobj 16 0 объектов > endobj 15246 0 объектов > endobj 1 0 объектов > / Shading> / ColorSpace> / Font> / ProcSet [/ PDF / Текст / ImageC / ImageI] / Свойства> / ExtGState >>> / тип / страница >> endobj 15249 0 объектов > endobj 15136 0 объектов > / Font> / ProcSet [/ PDF / Текст] / Свойства> / ExtGState >>> / тип / страница >> endobj 15257 0 объектов > endobj 15112 0 объектов > / Shading> / ColorSpace> / Font> / ProcSet [/ PDF / Текст / ImageC / ImageI] / Свойства> / ExtGState >>> / тип / страница >> endobj 15258 0 объектов > endobj 15103 0 объектов > / Shading> / ColorSpace> / Font> / ProcSet [/ PDF / Текст / ImageC / ImageI] / Свойства> / ExtGState >>> / тип / страница >> endobj 15259 0 объектов > endobj 15094 0 объектов > / Shading> / ColorSpace> / Font> / ProcSet [/ PDF / Текст / ImageC / ImageI] / Свойства> / ExtGState >>> / тип / страница >> endobj 15261 0 объектов > endobj 15078 0 объектов > / Shading> / ColorSpace> / Font> / ProcSet [/ PDF / Текст / ImageC / ImageI] / Свойства> / ExtGState >>> / тип / страница >> endobj 15263 0 объектов > endobj 15069 0 объектов > / Shading> / ColorSpace> / Font> / ProcSet [/ PDF / Текст / ImageC / ImageI] / Свойства> / ExtGState >>> / тип / страница >> endobj 15264 0 объектов > endobj 15060 0 объектов > / Shading> / ColorSpace> / Font> / ProcSet [/ PDF / Текст / ImageC / ImageI] / Свойства> / ExtGState >>> / тип / страница >> endobj 15265 0 объектов > endobj 15048 0 объектов > / Shading> / ColorSpace> / Font> / ProcSet [/ PDF / Текст / ImageC / ImageI] / Свойства> / ExtGState >>> / тип / страница >> endobj 15266 0 объектов > endobj 15038 0 объектов > / Shading> / ColorSpace> / Font> / ProcSet [/ PDF / Текст / ImageC / ImageI] / Свойства> / ExtGState >>> / тип / страница >> endobj 15267 0 объектов > endobj 15029 0 объектов > / Shading> / ColorSpace> / Font> / ProcSet [/ PDF / Текст / ImageC / ImageI] / Свойства> / ExtGState >>> / тип / страница >> endobj 15269 0 объектов > endobj 15012 0 объектов > / Shading> / ColorSpace> / Font> / ProcSet [/ PDF / Текст / ImageC / ImageI] / Свойства> / ExtGState >>> / тип / страница >> endobj 15270 0 объектов > endobj 15000 0 объектов > / Shading> / ColorSpace> / Font> / ProcSet [/ PDF / Текст / ImageC / ImageI] / Свойства> / ExtGState >>> / тип / страница >> endobj 15272 0 объектов > endobj 14983 0 объектов > / Shading> / ColorSpace> / Font> / ProcSet [/ PDF / Текст / ImageC / ImageI] / Свойства> / ExtGState >>> / тип / страница >> endobj 15278 0 объектов > endobj 14969 0 объектов > / Shading> / ColorSpace> / Font> / ProcSet [/ PDF / Текст / ImageC / ImageI] / Свойства> / ExtGState >>> / тип / страница >> endobj 15280 0 объектов > endobj 14959 0 объектов > / Shading> / ColorSpace> / Font> / ProcSet [/ PDF / Текст / ImageC / ImageI] / Свойства> / ExtGState >>> / тип / страница >> endobj 15281 0 объектов > endobj 14948 0 объектов > / Shading> / ColorSpace> / Font> / ProcSet [/ PDF / Текст / ImageC / ImageI] / Свойства> / ExtGState >>> / тип / страница >> endobj 15279 0 объектов > endobj 14925 0 объектов > / Shading> / ColorSpace> / Font> / ProcSet [/ PDF / Текст / ImageC / ImageI] / Свойства> / ExtGState >>> / тип / страница >> endobj 15282 0 объектов > endobj 14913 0 объектов > / Shading> / ColorSpace> / Font> / ProcSet [/ PDF / Текст / ImageC / ImageI] / Свойства> / ExtGState >>> / тип / страница >> endobj 15288 0 объектов > endobj 14894 0 объектов > / Shading> / ColorSpace> / Font> / ProcSet [/ PDF / Текст / ImageC / ImageI] / Свойства> / ExtGState >>> / тип / страница >> endobj 15289 0 объектов > endobj 14885 0 объектов > / Shading> / ColorSpace> / Font> / ProcSet [/ PDF / Текст / ImageC / ImageI] / Свойства> / ExtGState >>> / тип / страница >> endobj 15290 0 объектов > endobj 14870 0 объектов > / Shading> / ColorSpace> / Font> / ProcSet [/ PDF / Текст / ImageC / ImageI] / Свойства> / ExtGState >>> / тип / страница >> endobj 15291 0 объектов > endobj 14844 0 объектов > / Shading> / ColorSpace> / Font> / ProcSet [/ PDF / Текст / ImageC / ImageI] / Свойства> / ExtGState >>> / тип / страница >> endobj 15298 0 объектов > endobj 14822 0 объектов > / Shading> / ColorSpace> / Font> / ProcSet [/ PDF / Текст / ImageC / ImageI] / Свойства> / ExtGState >>> / тип / страница >> endobj 15299 0 объектов > endobj 14796 0 объектов > / Затенение> / ColorSpace> / Шрифт> / ProcSet [/ P

    .

    PNG - Википедия

    Портативная сетевая графика ( PNG ) в цифровом формате. PNG är speciellt vanligt for icke-fotografiska bilder på Internet, som ikoner, ritningar, grafik med mera. Delvis utvlacklades PNG som en ersättare for the den ldldade of och juridiskt omstridda GIF-стандартное состояние och har därför många av det formatets möjligheter men utan de allvarliga begränsningarna.

    PNG är, liksom GIF, en typ av icke-förstörande komprimering. Med andra ord kommer en bild som komprimeras som PNG att vara likadan som originalet efter dekomprimering.PNG fungerar bäst på bilder med stora, enfärgade områden. В качестве примера можно привести фотографии, приведенные ниже, в качестве примера, в качестве примера.

    PNG от 24 до 48 бит для создания RGB. PNG Harveven Stöd För En Alfakanal För Представительство в прозрачных. Я думаю, что все будет в порядке до тех пор, пока не будет получено 256 пикселей.

    Детальный отчет о функциональных возможностях до определенного срока. ICC-профиль и высшее значение для определения размеров.

    PNG erbjuder ett flertal модельер для представительства. Образцовый мастер-классы, представленные на выставке. Modellerna är som följer.

    Innan en bild kan kodas som en PNG-dataström måste ett antal преобразователь utföras på ursprungsbilden. [1]

    1. В случае непредвиденных обстоятельств мы отделяем Альфаканал.
    2. Beroende på vilken färgrepresentation som valts görs olika трансформер.
      • Ifall palett har valts som fregrepresentation skapas nu en tabell innehållande 256 Дополнительная информация о событиях. Värdena и tabellen представительства для färgerna и ursprungsbilden. Bildens alla pixlar ersätts седан со ссылкой до Десса Фэргер.
      • Om RGB valts som fregrepresentation görs två трансформер.
        1. Вы можете узнать, что такое RGB, пока не закончится.Блиден блир дэ свартвит мэн крэвер ментре лагергсутриме ан ан свартвит билд представительство в РГБ.
        2. Я хочу сказать, что у вас есть все, что вам нужно. Я бы хотел, чтобы все было хорошо. Прозрачный.
    3. PNG stöder ett förbestämt antal färgdjup. Я смотрю на это с большим интересом и уверенностью в своем роде.Я хотел бы поговорить о том, что происходит до конца, до конца года. Подробная информация о процессе реверсибеля и информации о финнах и PNG-данных.

    Processen att koda själva PNG-dataströmmen består av ett flertal steg. Я работаю над этой работой и работаю над этой работой. Оператор Dessa, представитель PNG-dataström som kan sparas, пока не заполнит скики и не станет средой.

    [redigera | redigera wikitext]

    Дела делятся и разбираются в разуме. Варьировать в уменьшенную версию сайта motsvarar en grovkornig version av ursprungsbilden. Tanken ärtti ju ju более низкий рейтинг som innehas desto mer komplett blir bilden. Подробная информация о визах в Канаду, США. Иннан Хела Билден. Под överföringsprocessen blir bilden progressivt mer detaljrik. Detta kan vara önskvärt vid до тех пор, пока не выйдет на поле зрения.

    PNG-стандартизированная система определения 2 прохода.

    • Нулевой метод получения извлеченных данных. Денна метод результат 1 и редурад билд. Originalbilden läses sekventiellt от Vänster до Höger, Rad För Rad Uppifrån OCHER. Варье рад и дэнсдейлд моцварас авен рад и оригинал билден. Подробная информация о снижении цен на товары и услуги.
    • Adam7 är en mer komplicerad метод для извлечения прохода. Denna Metod Resulterar i 7 Stycken Redurade Bilder.Большая часть из оригинальных фотографий с изображением 7-ми лучших моделей с 8 x 8 матрицами. Denna matris har egenskapen att varje rad i den downrade bilden blir lika lång.
    Exempel på hur Adam7 delar originalbilden

    Scanline сериализация [redigera | redigera wikitext]

    Varie Rad i den Redurade Bilden, En Så Kalad Scanline, представляет данные в байтах.

    Filtrering [redigera | redigera wikitext]

    Для получения более подробной информации по сканируемой линии и уменьшенному количеству фильтров. Dessa filter transmerar datan på så sttt att den blir mer komprimerad men bibehåller möjligheten att återställa ursprungsdatan. Более подробная информация о минимальной информации и различных пиксельных геномах, связанных с этим. PNG-стандартный бескривер 5-ти кратный фильтр для фильтров и фильтров.

    De olika filterreringstyperna beräknar för varje pixel ett nytt värde som for robendé rärgen i den pixeln. Подробная информация о геноме, в том числе и о том, как манипулировать геномом. De olika filterreringstyperna skiljer sig genom Вилка манипулятивная с сомнительной точки зрения.

    Filtreringstyperna ger varierande vinst vid komprimering beroende på hur originalbilden ser ut. Для получения более подробной информации о PNG-стандарте от olika filtertyper väljs på olika scanlines.Подробная информация о возможностях фильтрации всех возможных медийных данных и событий, связанных с сканированием, сканированием, сер. Ут.

    Результаты анализа и анализа данных. В настоящее время он просматривает несколько строк, в том числе и линию сканирования, а также информацию о том, что нужно сделать, чтобы узнать больше о фильме. Но не сомневаюсь, что это вета вид авкоднинген. [2]

    Коммерция [редигера | redigera wikitext]

    Алла просматривает слайды до следующего дня.Denna sekvens komprimeras med deflate-komprimering med den begränsningen att det glidande fönstret (en. Раздвижное окно) для одного значения 32768 байт. Den komprimerade dataströmmen är i formatet zlib. [3]

    Styckning [redigera | redigera wikitext]

    Vid styckningen (en. Chunking), skapas ett flertal så kallade stycken (en. Chunks). Детальная информация о том, что вы должны сделать это. PNG-датастроммен. Datan от féregående steg paketeras i IDAT-stycken. IHDR-stycke skapas med information om PNG-dataströmmen.Även ett IEND-stycke och eventuella underordnade stycken skapas.

    PNG-стандартизированный справочник по стилю. De erbjuder olika egenskaper som kan adderas до PNG-датастроммен. Några av typerna обязательна для мужчин и женщин вальфрии. Более подробную информацию можно найти на сайте PNG: s функционал. Мы работаем над этим, чтобы быть в курсе всех событий, связанных с реализацией проекта.

    Styckestyperna är Indelade i två Kategorier.De kritiska (stycken som är mustatoriska) очная андеграундная вилка и валфрия.

    För att en PNG-dataström skall vara korrekt skall den inledas med en 8 sign by stor signatur.

    PNG-подпись и десятичное представление [4]

     137 80 78 71 13 10 26 10
     

    Фирменный знак «IHDR-стиль» и стиль «IDAT-стиль» и «IEND-стиль». De Eventuella Underordnade Styckena Placeras Enigt Deras Спецификация.Antingen före eller efter IDAT-styckena men aldrig utanför IHDR- och IEND-styckena.

    Stycken [redigera | redigera wikitext]

    Varje stycke består av 4 fält. [4]

    • Längd: 4 байта stort positivt heltal som beskriver storleken i byte på datafältet.
    • Stycksetyp: 4 байта сома indikerar vilken styckestyp detta stycke är.
    • Datafält: . Ден эвентуэлла датан сом стайнет иннхоллер.
    • CRC: .4 байта и данные CRC.
    Kritiska stycken [redigera | redigera wikitext]

    De kritiska styckena är vitala för att överhuvudtaget kunna visa en bild. Alla applikationer som använder PNG Большинство исполнителей для ознакомления с историческим камнем.

    IHDR [redigera | redigera wikitext]

    Det första stycket i en PNG-dataström. Информация о его финансах и услугах, связанных с этим, не ограничивается.

    IHDR styckestyp i десятичное представление. [5]

     73 72 68 82
     

    IHDR datafält innehåller följande fält. [6]

    • Bredd: 4 байта определен bredden på bilden.
    • Höjd: 4 байта определен höjden på bilden.
    • Примечание: 1 байт определитель färgdjupet som användes vid kodningen.
    • Färgtyp: 1-байтовый определитель vilken modell som anvnds для представления представления в färgerna.Värdet är summan av de tal som motsvarar de egenskaper som används. Palettbaserad har talet 1, RGB har talet 2 или alfakanal talet 4. До того, как вы получите опыт RGB и alfakanal värdet 6. Valet av harbetp sätter vissa Кришнсингар англоязычная вилла до конца года.
    • Filtreringsmetod: 1-байтовый метод, определяемый как исходный код.
    • Редукторсметод: 1-байтовый определитель vilken som användes vid Reductionringen av ursprungsbilden.Giltiga värden är 0 для нулевого метода и 1 для Adam7-метода.
    IDAT [redigera | redigera wikitext]

    Innehåller den komprimerade bilddatan. En PNG-dataström kan innehålla ett flertal efter varandra följande IDAT-stycken. Storleken på IDAT-styckena up up to kodaren at avgöra. De kan vara allt от 0 байтов и выше.

    IDAT styckestyp i десятичное представление. [7]

     73 68 65 84
     
    PLTE [redigera | redigera wikitext]

    PLTE-stylet innehåller bildens palett.Начиная с 1–256 до настоящего времени, от 0 до 255. Dessa färgvärden refereras седан от eller flera pixlar i bilden. Varje färgvärde beskriver en färg med 8 bitar djup, детта оавсетт вилке, членство в нем, в том числе коднинген ав билден.

    PLTE-stycket от конца до конца для самых разных людей в разных сферах деятельности и RGB, а также в PLTE-stycke. Для ознакомления с опытом работы с RGB и PLTE-стилем от другого человека есть возможность заявить о себе в детстве в течение последних лет, используя RGB erbjuder.

    PLTE styckestyp i десятичное представление. [8]

     80 76 84 69
     
    IEND [redigera | redigera wikitext]

    Styke som markerar slutet på en PNG-dataström. Datafältet p IEND-stycket är tomt.

    IEND styckestyp i десятичное представление. [9]

     73 69 78 68
     
    Подземная стайкен [redigera | redigera wikitext]

    De underordnade styckena tillför дополнительный функционал до двух дней.Exempel på detta kan vara ICC-profil eller pixlarnas fysiska mått. Подробная информация о заявках на участие в программе PNG skall kunna tolka dessa stycken. В связи с этим у вас есть все, что вам нужно сделать, чтобы получить медицинскую помощь от других лиц.

    • тРНС: Specificerar en eller flera färger som transparens.
    • cHRM: Bildens krominans och vitbalans.
    • ГАМА: Гамма Билденса.
    • iCCP: ICC-профиль.
    • сБИТ: Specificerar antalet signifikanta bitar.
    • sRGB: Indikerar att sRGB и некоторые другие.
    • ТЕКСТ: Разнообразные текстовые сообщения, такие как скапаре.
    • zTXt: разнообразный текстовый текст, который называется «скапаре».
    • iTXt: разнообразный текстовый кодад мед UTF-8.
    • ч.р.д.
    • HIST: Ungefärlig förekomstfrekvens for färgerna i paletten.
    • pHYs: Pixlarnas fysiska mått.
    • SPLT: Альтернативная палитра, визы для RGB Кан виз.Характеристики портативной сетевой графики (PNG) (второе издание) - IEND
    • ,

      % PDF-1.6 % 41351 0 объектов > endobj Xref 41351 382 0000000016 00000 n 0000022544 00000 n 0000022796 00000 n 0000022844 00000 n 0000022875 00000 n 0000022926 00000 n 0000022966 00000 n 0000024279 00000 n 0000024409 00000 n 0000024533 00000 n 0000024657 00000 n 0000024781 00000 n 0000024905 00000 n 0000025020 00000 n 0000025135 00000 n 0000025246 00000 n 0000025357 00000 n 0000025486 00000 n 0000025615 00000 n 0000025734 00000 n 0000025853 00000 n 0000025978 00000 n 0000026102 00000 n 0000026217 00000 n 0000026331 00000 n 0000026449 00000 n 0000026586 00000 n 0000026627 00000 n 0000026680 00000 n 0000026733 00000 n 0000026792 00000 n 0000027194 00000 n 0000027274 00000 n 0000030992 00000 n 0000031421 00000 n 0000031563 00000 n 0000031969 00000 n 0000032317 00000 n 0000035861 00000 n 0000035945 00000 n 0000039878 00000 n 0000043434 00000 n 0000046685 00000 n 0000049994 00000 n 0000053143 00000 n 0000056729 00000 n 0000059425 00000 n 0000096760 00000 n 0000096994 00000 n 0000097595 00000 n 0000128377 00000 n 0000128618 00000 n 0000129190 00000 n 0000133004 00000 n 0000133963 00000 n 0000134155 00000 n 0000134832 00000 n 0000135070 00000 n 0000135847 00000 n 0000136688 00000 n 0000136861 00000 n 0000137035 00000 n 0000138037 00000 n 0000138485 00000 n 0000138669 00000 n 0000139281 00000 n 0000139355 00000 n 0000139429 00000 n 0000139508 00000 n 0000139587 00000 n 0000139666 00000 n 0000139745 00000 n 0000139952 00000 n 0000140064 00000 n 0000140138 00000 n 0000140213 00000 n 0000140328 00000 n 0000140440 00000 n 0000140514 00000 n 0000140607 00000 n 0000140719 00000 n 0000140794 00000 n 0000140868 00000 n 0000140983 00000 n 0000141095 00000 n 0000141169 00000 n 0000141242 00000 n 0000141357 00000 n 0000141469 00000 n 0000141541 00000 n 0000141634 00000 n 0000141746 00000 n 0000141820 00000 n 0000141935 00000 n 0000142047 00000 n 0000142125 00000 n 0000142203 00000 n 0000142431 00000 n 0000142543 00000 n 0000142621 00000 n 0000142696 00000 n 0000142771 00000 n 0000142909 00000 n 0000143021 00000 n 0000143096 00000 n 0000143171 00000 n 0000143246 00000 n 0000143325 00000 n 0000143509 00000 n 0000143621 00000 n 0000143698 00000 n 0000143813 00000 n 0000143925 00000 n 0000144003 00000 n 0000144081 00000 n 0000144160 00000 n 0000144235 00000 n 0000144314 00000 n 0000144392 00000 n 0000144465 00000 n 0000144693 00000 n 0000144805 00000 n 0000144879 00000 n 0000144972 00000 n 0000145084 00000 n 0000145158 00000 n 0000145273 00000 n 0000145385 00000 n 0000145460 00000 n 0000145539 00000 n 0000145617 00000 n 0000145691 00000 n 0000145766 00000 n 0000145950 00000 n 0000146062 00000 n 0000146141 00000 n 0000146256 00000 n 0000146368 00000 n 0000146441 00000 n 0000146519 00000 n 0000146630 00000 n 0000146746 00000 n 0000146819 00000 n 0000146957 00000 n 0000147069 00000 n 0000147148 00000 n 0000147223 00000 n 0000147333 00000 n 0000147445 00000 n 0000147524 00000 n 0000147602 00000 n 0000147681 00000 n 0000147819 00000 n 0000147931 00000 n 0000148469 00000 n 0000148595 00000 n 0000148619 00000 n 0000149156 00000 n 0000149282 00000 n 0000149306 00000 n 0000149843 00000 n 0000149969 00000 n 0000149993 00000 n 0000150538 00000 n 0000150668 00000 n 0000150692 00000 n 0000151228 00000 n 0000151351 00000 n 0000151375 00000 n 0000151919 00000 n 0000152050 00000 n 0000152074 00000 n 0000152612 00000 n 0000152738 00000 n 0000152762 00000 n 0000153300 00000 n 0000153426 00000 n 0000153450 00000 n 0000153988 00000 n 0000154114 00000 n 0000154138 00000 n 0000154202 00000 n 0000154350 00000 n 0000154494 00000 n 0000154618 00000 n 0000154734 00000 n 0000154939 00000 n 0000155175 00000 n 0000155301 00000 n 0000155517 00000 n 0000155703 00000 n 0000155823 00000 n 0000156008 00000 n 0000156135 00000 n 0000156342 00000 n 0000156468 00000 n 0000156586 00000 n 0000156781 00000 n 0000156953 00000 n 0000157173 00000 n 0000157370 00000 n 0000157526 00000 n 0000157724 00000 n 0000157929 00000 n 0000158051 00000 n 0000158327 00000 n 0000158578 00000 n 0000158720 00000 n 0000158898 00000 n 0000159073 00000 n 0000159335 00000 n 0000159559 00000 n 0000159769 00000 n 0000159909 00000 n 0000160019 00000 n 0000160184 00000 n 0000160304 00000 n 0000160416 00000 n 0000160555 00000 n 0000160676 00000 n 0000160819 00000 n 0000160984 00000 n 0000161123 00000 n 0000161436 00000 n 0000161598 00000 n 0000161766 00000 n 0000162011 00000 n 0000162150 00000 n 0000162285 00000 n 0000162457 00000 n 0000162599 00000 n 0000162763 00000 n 0000162922 00000 n 0000163059 00000 n 0000163212 00000 n 0000163383 00000 n 0000163541 00000 n 0000163765 00000 n 0000163942 00000 n 0000164121 00000 n 0000164279 00000 n 0000164483 00000 n 0000164654 00000 n 0000164813 00000 n 0000164976 00000 n 0000165181 00000 n 0000165308 00000 n 0000165423 00000 n 0000165586 00000 n 0000165709 00000 n 0000165848 00000 n 0000166025 00000 n 0000166224 00000 n 0000166389 00000 n 0000166528 00000 n 0000166691 00000 n 0000166874 00000 n 0000167059 00000 n 0000167273 00000 n 0000167449 00000 n 0000167726 00000 n 0000167839 00000 n 0000168092 00000 n 0000168226 00000 n 0000168450 00000 n 0000168727 00000 n 0000168956 00000 n 0000169095 00000 n 0000169242 00000 n 0000169372 00000 n 0000169614 00000 n 0000169751 00000 n 0000169908 00000 n 0000170057 00000 n 0000170250 00000 n 0000170397 00000 n 0000170598 00000 n 0000170788 00000 n 0000170982 00000 n 0000171135 00000 n 0000171348 00000 n 0000171551 00000 n 0000171750 00000 n 0000171947 00000 n 0000172063 00000 n 0000172231 00000 n 0000172486 00000 n 0000172704 00000 n 0000172882 00000 n 0000173051 00000 n 0000173316 00000 n 0000173506 00000 n 0000173726 00000 n 0000173967 00000 n 0000174187 00000 n 0000174343 00000 n 0000174526 00000 n 0000174661 00000 n 0000174824 00000 n 0000175035 00000 n 0000175176 00000 n 0000175301 00000 n 0000175432 00000 n 0000175599 00000 n 0000175792 00000 n 0000175924 00000 n 0000176140 00000 n 0000176341 00000 n 0000176538 00000 n 0000176646 00000 n 0000176818 00000 n 0000176975 00000 n 0000177120 00000 n 0000177287 00000 n 0000177424 00000 n 0000177561 00000 n 0000177745 00000 n 0000178043 00000 n 0000178205 00000 n 0000178429 00000 n 0000178608 00000 n 0000178819 00000 n 0000179052 00000 n 0000179205 00000 n 0000179402 00000 n 0000179532 00000 n 0000179732 00000 n 0000179927 00000 n 0000180086 00000 n 0000180275 00000 n 0000180479 00000 n 0000180593 00000 n 0000180720 00000 n 0000180843 00000 n 0000180968 00000 n 0000181109 00000 n 0000181228 00000 n 0000181413 00000 n 0000181611 00000 n 0000181973 00000 n 0000182148 00000 n 0000182300 00000 n 0000182428 00000 n 0000182567 00000 n 0000182720 00000 n 0000182857 00000 n 0000183030 00000 n 0000183157 00000 n 0000183310 00000 n 0000183521 00000 n 0000183691 00000 n 0000183881 00000 n 0000184086 00000 n 0000184270 00000 n 0000184418 00000 n 0000184583 00000 n 0000184754 00000 n 0000184975 00000 n 0000185182 00000 n 0000185381 00000 n 0000185586 00000 n 0000185827 00000 n 0000186042 00000 n 0000186317 00000 n 0000186574 00000 n 0000186773 00000 n 0000186960 00000 n 0000187199 00000 n 0000187362 00000 n 0000187571 00000 n 0000187814 00000 n 0000187938 00000 n 0000188076 00000 n 0000188287 00000 n 0000188451 00000 n 0000188583 00000 n 0000188727 00000 n 0000188863 00000 n 0000188992 00000 n 0000189121 00000 n 0000189264 00000 n 0000008093 00000 n прицеп ] >> startxref 0 %% EOF 41732 0 объектов > поток x} yXSWNTBP "@ fEAk-`PZKmp`jjAIRB29kZK-h Ւ VaV * SU ޞ3 h {'ydkz {ߵ6 aK #> vxQ

      .
      Ihdr: PNG — not GIF! / Хабр

    Отправить ответ

    avatar
      Подписаться  
    Уведомление о
    Пролистать наверх