Из чего состоит файл изображения
Способ кодирования информации с помощью последовательности байт называютформатом. Графический формат - это способ записи графической информации. Все графические форматы подразделяются на растровые и векторные.
Растровый формат характеризуется тем, что все изображение по вертикали и горизонтали разбивается на достаточно мелкие прямоугольники - так называемые элементы изображения, или пикселы (от английского pixel - picture element).
В файле, содержащем растровую графику, хранится информация о цвете каждого пиксела данного изображения. Размер изображения, хранящегося в файле, задается в виде числа пикселов по горизонтали и вертикали.
Наиболее распространенные графические форматы:
1) PCX - Простейший растровый формат. Первоначально этот формат использовался в программе PaintBrush фирмы Zsoft, однако в последствии получил широкое распространение среди пакетов редактирования растровых изображений, хотя до сих пор не признан в качестве официального стандарта. К сожалению, в процессе своей эволюции PCX претерпел настолько значительные изменения, что современная версия формата, поддерживающая 24-разрядный цветовой режим, не может использоваться старыми программами. С самого "рождения" формат PCX был ориентирован на существующие видеоадаптеры (сначала EGA, потом VGA) и поэтому является аппаратно-зависимым. В PCX используется схема сжатия данных RLE, позволяющая уменьшать размер файла, например, на 40 - 70%, если используется 16 и менее цветов, и на 10 - 30% для 256-цветных изображений;
2)BMP - (Windows Bitmap) разрабатывался фирмой Microsoft как совместимый со всеми приложениями Windows. Для приложений в операционной системе OS/2 имеется собственная версия BMP. В формате BMP можно сохранять черно-белые, серые полутоновые, индексные цветные и цветные изображения системы RGB (но не двухцветные или цветные изображения системы CMYK). Недостаток этих графических форматов: большой объем. Следствие - малая пригодность для Internet-публикаций;
4)TIFF (target image file format) - был разработан специально для использования в приложениях, связанных с компоновкой страницы и направлен на преодоление трудностей, которые возникают при переносе графических файлов с IBM-совместимых компьютеров на Macintosh и обратно. Он поддерживается всеми основными графическими пакетами и пакетами редактирования изображений и читается на многих платформах. Использует сжатие изображения (LZW). Формат TIFF очень удобен, но за это приходится расплачиваться огромными размерами получаемых файлов (например, файл формата А4 в цветовой модели CMYK с разрешением 300 dpi, обычно применяемым для высококачественной печати, имеет размер около 40 Мбайт). Кроме того, существует несколько "диалектов" формата, которые не каждая программа, поддерживающая TIFF, легко "понимает";
5)JPEG - миллионы цветов и оттенков, палитра не настраиваемая, предназначен для представления сложных фотоизображений. Разновидность progressive JPEG позволяет сохранять изображения с выводом за указанное количество шагов (от 3 до 5 в Photoshop'e) - сначала с маленьким разрешением (плохим качеством), на следующих этапах первичное изображение перерисовывается все более качественной картинкой. Анимация или прозрачный цвет форматом не поддерживаются. Уменьшение размера файла достигается сложным математическим алгоритмом удаления информации - чем заказываемое качество ниже, тем коэффициент сжатия больше, файл меньше. Главное, подобрать максимальное сжатие при минимальной потере качества. Последний идентифицирует и отбрасывает данные, которые человеческий глаз не в состоянии увидеть (незначительные изменения в цвете не различаются человеком, тогда как улавливается даже малейшая разница в интенсивности, поэтому JPEG меньше подходит для обработки черно-белых полутоновых изображений), что приводит к существенному уменьшению размера файла. Таким образом, в отличие от метода сжатия LZW или RLE в результате применения технологии JPEG данные теряются навсегда. Так, файл, однажды записанный в формате JPEG, а затем переведенный, скажем, в TIFF, уже не будет тем же, что и оригинал. Наиболее подходящий формат для размещения в Интернете полноцветных изображений. Вероятно, до появления мощных алгоритмов сжатия изображения без потери качества останется ведущим форматом для представления фотографий в Web;
6)PNG - пока малораспространен из-за слабой рекламы, создавался специально для Интернета как замена первых двух форматов и благодаря патентной политике Compuserve постепенно вытесняет GIF (см. выше). Позволяет выбирать палитру сохранения - серые полутона, 256 цветов, true color ("истинные цвета"). В зависимости от свойств изображения действительно иногда предпочтительнее GIF'a или JPG'a. Позволяет использовать "прозрачный" цвет, но, в отличие от GIF'a таких цветов может быть до 256. В отличие от GIF сжатие без потери качества производится и по горизонтали и по вертикали (алгоритм собственный, параметры тоже не настраиваемые). Не умеет создавать анимированные ролики (разрабатывается формат MNG).
7)PDF (Portable Document Format) - это пример смешанного формата, предназначенного для хранения текста и графики одновременно. В формате PDF сохраняются данные текстовым редактором Adobe Acrobat. Для сжатия графики применяется метод LZW;
8)PSD - формат графического редактора Adobe Photoshop. Обладает очень большими возможностями. Хранит данные о различных палитрах цветов, о прозрачности, имеет возможность хранения послойных изображений. При этом отличается большим размером.
2. ГРАФИЧЕСКИЕ РЕДАКТОРЫ, ИСПОЛЬЗУЕМЫЕ ДЛЯ СОЗДАНИЯ ИЗОБРАЖЕНИЙ
.1 ПРОГРАММЫ ПРОСМОТРА ГРАФИЧЕСКИХ ИЗОБРЖЕНИЙ
Программа для просмотра изображений - тип программного обеспечения, предназначенного для просмотра мультимедийных данных, в первую очередь изображений.
К изображениям относятся фотографии, рисунки, нарисованные вручную, а также текстовые документы, преобразованные в электронную форму, как правило, с помощью сканирующего устройства, такого, как цифровая камера, факсимильный аппарат или сканер. Изображения можно загружать с такого устройства и сохранять в папке. Загруженные на компьютер изображения можно смотреть в виде слайдов или с помощью программы просмотра изображений и факсов Windows.
Программа просмотра изображений и факсов Windows позволяет работать с изображениями, не открывая приложений редактирования изображений. Если файлы изображений хранятся в папке «Мои рисунки», окно просмотра отображается автоматически. Дважды щелкнув изображение, можно просмотреть его в программе просмотра изображений и факсов Windows, позволяющей делать следующее:
1) прокручивать изображения, находящиеся в папке;
2) увеличивать и уменьшать размер просматриваемого изображения;
) просматривать изображение в полном размере или в формате, наиболее походящем для размеров окна;
) управлять файлами изображений, а также печатать, сохранять, удалять и изменять сведения о файлах;
) просматривать в виде демонстрации слайдов все изображения или отобранную группу изображений;
) в случае необходимости открывать изображение в программе редактирования (заметьте, что при этом программа просмотра изображений и факсов Windows закрывается);
) поворачивать изображения вправо и влево на 90 градусов.
Кроме того, файлы факсов и файлы TIFF можно просматривать и снабжать пометками, используя панель инструментов пометок.
.2 РЕДАКТОРЫ РАСТРОВОЙ ГРАФИКИ
Paint - простой (или лучше сказать - простейший) редактор, входящий в стандартную поставку операционных систем Microsoft. Он обладает набором простейших функций (кисточка, карандаш, резинка и т.д.), которые позволяют создавать незамысловатые картинки. К сожалению, для обработки графики он практически не пригоден.Photoshop - на сегодняшний день это самый мощный пакет для профессиональной обработки растровой графики[5]. Это целый комплекс, обладающий многочисленными возможностями модификации растрового рисунка, имеющий огромный набор различных фильтров и эффектов, причем есть возможность подключать инструменты независимых производителей.
Пакет предлагает, например, средства для восстановления поврежденных изображений, ретуширования фотографий или создания самых фантастических коллажей, которые только может позволить себе наше воображение. В общем, потенциал этого пакета поистене огромен. Начиная с версии 5.5 в пакет включена программа Adobe ImageReady, предоставляющие огромные возможности по обработке графики под WEB (оптимизация изображений, создание анимированных gif, "разрезание" картинок на более мелкие и т.д.). Девиз разработчиков Adobe Photoshop - "Camera of your mind" - предполагает не только техническоУе совершенство, но и полную свободу творчества, на которую человек, работающий с этой программой, просто обречен.- еще один не менее известный графический редактор (из пакета Corel Draw) для обработки растровой графики, конкурирующий с Adobe Photoshop. Здесь также имеются все необходимые инструменты для обработки графики, разнообразные фильтры, текстуры. Разница лишь в удобстве работы, интерфейсе и скорости наложения фильтров - наложение происходит немного медленнее.- редактор предоставляет великолепные возможности для эмуляции реальных инструментов рисования: графит, мел, масло и т.д. Также позволяет имитировать фактуру поверхности материалов, живопись, создавать анимацию. Очень удобен для разработки фоновых рисунков или Web-страниц в стиле живописи. Пользуясь это программой чуствуешь себя настоящим художником.
Существует еще ряд редакторов (Microsoft Photo Editor, Microsoft Photo DRAW), также позволяющих реализовать простейшие задачи, но не удовлетворяющих запросам профессионалов.
.3 РЕДАКТОРЫ ВЕКТОРНОЙ ГРАФИКИ
Illustrator - пакет позволяет создавать, обрабатывать и редактировать векторную графику. По своей мощности он эквивалентенрастровому редактору Adobe Photoshop: имеет аналогичный интерфейс, позволяет подключать различные фильтры и эффекты, понимает многие графические форматы, даже такие как.cdr (Corel Draw) и.swf (Flash).- безусловно, такой известный графический пакет не мог обойтись без средств для обработки векторной графики. Пакет по своей мощности практически не уступает графическим редакторам Adobe Photoshop и Adobe Illustrator. Помимо обработки векторной графики, в этом пакете существует обработчик растровой графики (Photo Paint), трассировщик изображений, редактор шрифтов, подготовки текстур и создания штрихкодов, а также огромные коллекции с изображениями (CorelGallery).Streamline - еще один продукт фирмы Adobe, предназначенный для трассировки (перевода) растровой графики в векторную. Это небольшой, но очень полезный и мощный продукт. Особенно полезен, если вы создаете Web-страницы с использованием векторной графики, например, технологии Flash.
.4 ПОНЯТИЯ ТРЁХМЕРНОЙ ГРАФИКИ. РЕДАКТОРЫ, ИСПОЛЬЗУЕМЫЕ ДЛЯ СОЗДАНИЯ ТРЁХМЕРНЫХ ИЗОБРАЖЕНИЙ
Трёхмерная графика (3D, 3 Dimensions, измерения) - раздел компьютерной графики, охватывающий алгоритмы и программное обеспечение для оперирования объектами в трёхмерном пространстве, а также результат работы таких программ. Больше всего применяется для создания изображений в архитектурной визуализации, кинематографе, телевидении, компьютерных играх, печатной продукции, а также в науке.
Трёхмерное изображение отличается от плоского построением геометрической проекции трёхмерной модели сцены на экране компьютера с помощью специализированных программ[8].
При этом модель может, как соответствовать объектам из реального мира (автомобили, здания, ураган, астероид), так и быть полностью абстрактной (проекция четырёхмерного фрактала).
Для получения трёхмерного изображения требуются следующие шаги:
1) моделирование - создание математической модели сцены и объектов в ней;
2) рендеринг - построение проекции в соответствии с выбранной физической моделью.
В сцене могут участвовать следующие типы объектов:
1) источники света;
2) геометрические примитивы - сфера, куб, конус, а также тела, описываемые квадратными и кубическими уравнениями;
) каркасы (англ. mesh) - группы связанных между собой "встык" треугольников, образующих иллюзию тела или поверхности среды;
) среды жидкости в стаканах, газы, например, воздух в атмосфере, дымы;
Есть и концептуально более сложные типы, как, например, искажения пространства или системы частиц.
Задача трёхмерного моделирования - описать эти объекты и разместить их на сцене с помощью геометрических преобразований в соответствии с требованиями к будущему изображению.
На «Рендеринг» этапе математическая (векторная) пространственная модель превращается в плоскую картинку. Если требуется создать фильм, то рендерится последовательность таких картинок, по одной для каждого кадра. Как структура данных, изображение на экране представлено матрицей точек, где каждая точка определена по крайней мере тремя числами: интенсивностью красного, синего и зелёного цвета. Таким образом рендеринг преобразует трёхмерную векторную структуру данных в плоскую матрицу пикселов. Этот шаг часто требует очень сложных вычислений, особенно если требуется создать иллюзию реальности. Самый простой вид рендеринга - это построить контуры моделей на экране компьютера с помощью проекции, как показано выше. Обычно этого недостаточно и нужно создать иллюзию материалов, из которых изготовлены объекты, а также рассчитать искажения этих объектов за счёт прозрачных сред (например, жидкости в стакане). Существует несколько технологий рендеринга, часто комбинируемых вместе. Например:
1) сканлайн (scanline) - расчёт цвета каждой точки картинки построением луча из точки зрения наблюдателя через воображаемое отверстие в экране на месте этого пиксела "в сцену" до пересечения с первой поверхностью. Цвет пиксела будет таким же, как цвет этой поверхности;
2) Трассировка лучей (рейтрейсинг) - то же, что и сканлайн, но цвет пиксела уточняется за счёт построения дополнительных лучей (отражённых, преломлённых и т.д.) от точки пересечения луча взгляда;
) глобальная иллюминация, radiosity) - расчёт взаимодействия поверхностей и сред в видимом спектре излучения с помощью интегральных уравнений и другие.
Программные пакеты, позволяющие производить трёхмерную графику, то есть моделировать объекты виртуальной реальности и создавать на основе этих моделей изображения, очень разнообразны. Последние годы устойчивыми лидерами в этой области являются коммерческие продукты: такие как Autodesk 3DS Max, Maya, Newtek LightWave, SOFTIMAGE XSI и сравнительно новые Rhinoceros 3D, Cinema 4D или ZBrush. Кроме того, уверенно набирают популярность и открытые продукты, распространяемые свободно, например, полнофункциональный пакет Blender.
.5 ПОНЯТИЯ ЦВЕТОВОГО ПРОСТРАНСТВА. ОСНОВНЫЕ ЦВЕТОВЫЕ МОДЕЛИ (RGB, CMYK)
Цветовое пространство представляет собой модель представления цвета, основанную на использовании цветовых координат[6]. Цветовое пространство строится таким образом, чтобы любой цвет был представим точкой, имеющей определённые координаты, причём так, чтобы одному набору координат соответствовал один цвет.
Цветовые пространства описываются набором цветовых координат и правилами построения цветов. К примеру, RGB является трёхмерным цветовым пространством, где каждый цвет описан набором из трёх координат - каждая из них отвечает компоненте цвета в разложении на красный, зелёный и синий цвета. Количество координат задаёт размерность пространства. Существует масса цветовых пространств различной размерности - от одномерных, которые могут описать исключительно монохромное изображение, до шести и десяти-мерных, таких, например, как пространство CMYKLcLm (Cyan, Magenta, Yellow, Key color, lightCyan, lightMagenta). Пространства высокой размерности чаще всего используются в целях печати на плоттерах или аппаратах для цветопроб.(аббревиатура английских слов Red, Green, Blue - красный, зелёный, синий) - аддитивная цветовая модель, как правило, описывающая способ синтеза цвета для цветовоспроизведения. В российской традиции иногда обозначается как КЗС.
Выбор основных цветов обусловлен особенностями физиологии восприятия цвета сетчаткой человеческого глаза. Цветовая модель RGB нашла широкое применение в технике.
Аддитивной она называется потому, что цвета получаются путём добавления (англ. addition) к черному. Иначе говоря, если цвет экрана, освещённого цветным прожектором, обозначается в RGB как (r1, g1, b1), а цвет того же экрана, освещенного другим прожектором, - (r2, g2, b2), то при освещении двумя прожекторами цвет экрана будет обозначаться как (r1+r2, g1+g2, b1+b2).
Изображение в данной цветовой модели состоит из трёх каналов. При смешении основных цветов (основными цветами считаются красный, зелёный и синий) - например, синего (B) и красного (R), мы получаем пурпурный (M magenta), при смешении зеленого (G) и красного (R) - жёлтый (Y yellow), при смешении зеленого (G) и синего (B) - циановый (С cyan). При смешении всех трёх цветовых компонентов мы получаем белый цвет (W).
В телевизорах и мониторах применяются три электронных пушки (светодиода, светофильтра) для красного, зелёного и синего каналов.
Цветовая модель RGB имеет по многим тонам цвета более широкий цветовой охват (может представить более насыщенные цвета), чем типичный охват цветов CMYK, поэтому иногда изображения, замечательно выглядящие в RGB, значительно тускнеют и гаснут в CMYK.
Четырёхцветная автотипия (CMYK: Cyan, Magenta, Yellow, Key color) - субтрактивная схема формирования цвета, используемая прежде всего в полиграфии для стандартной триадной печати. Схема CMYK, как правило, обладает сравнительно небольшим цветовым охватом.
По-русски эти цвета часто называют так: голубой, пурпурный, жёлтый; но профессионалы подразумевают cyan, magenta и yellow (о значении K см. далее). Печать четырьмя красками, соответствующими CMYK, также называют печатью триадными красками.
Ясно, что цвет в CMYK зависит не только от спектральных характеристик красителей и от способа их нанесения, но и их количества, характеристик бумаги и других факторов. Фактически цифры CMYK являются лишь набором аппаратных данных для фотонаборного автомата или CTP и не определяют цвет однозначно.
Так, исторически в разных странах сложилось несколько стандартизованных процессов офсетной печати. Сегодня это американский, европейский и японский стандарты для мелованной и немелованной бумаг[5]. Именно для этих процессов разработаны стандартизованные бумаги и краски. Для них же созданы соответствующие цветовые модели CMYK, которые используются в процессах цветоделения. Однако, многие типографии, в которых работают специалисты с достаточной квалификацией (или способные на время пригласить такого специалиста), нередко создают профиль, описывающий печатный процесс конкретной печатной машины с конкретной бумагой. Этот профиль они предоставляют своим заказчикам.
Вам когда-нибудь хотелось узнать как устроен jpg-файл? Сейчас разберемся! Прогревайте ваш любимый компилятор и hex-редактор, будем декодировать это:
Специально взял рисунок поменьше. Это знакомый, но сильно пережатый favicon Гугла:
Последующее описание упрощено, и приведенная информация не полная, но зато потом будет легко понять спецификацию.
Даже не зная, как происходит кодирование, мы уже можем кое-что извлечь из файла.
[FF D8] — маркер начала. Он всегда находится в начале всех jpg-файлов.
Следом идут байты [FF FE]. Это маркер, означающий начало секции с комментарием. Следующие 2 байта [00 04] — длина секции (включая эти 2 байта). Значит в следующих двух [3A 29] — сам комментарий. Это коды символов ":" и ")", т.е. обычного смайлика. Вы можете увидеть его в первой строке правой части hex-редактора.
А как хранятся файлы на телефоне и планшете?
Точно так же, как и на компьютере, только там может быть своя файловая система (способ внутренней организации). Про файловые системы и про то, какие они бывают, поговорим в следующей статье.
Построение дерева кодов Хаффмана
Мы должны построить бинарное дерево по таблице, которую мы получили в секции DHT. А уже по этому дереву мы узнаем каждый код. Значения добавляем в том порядке, в каком указаны в таблице. Алгоритм прост: в каком бы узле мы ни находились, всегда пытаемся добавить значение в левую ветвь. А если она занята, то в правую. А если и там нет места, то возвращаемся на уровень выше, и пробуем оттуда. Остановиться нужно на уровне равном длине кода. Левым ветвям соответствует значение 0, правым — 1.
Деревья для всех таблиц этого примера:
В кружках — значения кодов, под кружками — сами коды (поясню, что мы получили их, пройдя путь от вершины до каждого узла). Именно такими кодами закодировано само содержимое рисунка.
Маркер [FF C4]: DHT (таблица Хаффмана)
Эта секция хранит коды и значения, полученные кодированием Хаффмана.
- [00 15] Длина: 21 байт
- [0_] Класс: 0 (0 — таблица DC коэффициентов, 1 — таблица AC коэффициентов).
- [_0] Идентификатор таблицы: 0
Следующие 16 значений:
Количество кодов означает количество кодов такой длины. Обратите внимание, что секция хранит только длины кодов, а не сами коды. Мы должны найти коды сами. Итак, у нас есть один код длины 1 и один — длины 2. Итого 2 кода, больше кодов в этой таблице нет.
С каждым кодом сопоставлено значение, в файле они перечислены следом. Значения однобайтовые, поэтому читаем 2 байта:
Далее в файле можно видеть еще 3 маркера [FF C4], я пропущу разбор соответствующих секций, он аналогичен вышеприведенному.
Маркер [FF DA]: SOS (Start of Scan)
Байт [DA] в маркере означает — «ДА! Наконец-то то мы перешли к финальной секции!». Однако секция символично называется SOS.
- [00 0C] Длина: 12 байт.
- [03] Количество каналов. У нас 3, по одному на Y, Cb, Cr.
- [01] Идентификатор канала: 1 (Y)
- [0_] Идентификатор таблицы Хаффмана для DC коэффициентов: 0
- [_0] Идентификатор таблицы Хаффмана для AC коэффициентов: 0
- [02] Идентификатор канала: 2 (Cb)
- [1_] Идентификатор таблицы Хаффмана для DC коэффициентов: 1
- [_1] Идентификатор таблицы Хаффмана для AC коэффициентов: 1
- [03] Идентификатор канала: 3 (Cr)
- [1_] Идентификатор таблицы Хаффмана для DC коэффициентов: 1
- [_1] Идентификатор таблицы Хаффмана для AC коэффициентов: 1
[00], [3F], [00] — Start of spectral or predictor selection, End of spectral selection, Successive approximation bit position. Эти значения используются только для прогрессивного режима, что выходит за рамки статьи.
Отсюда и до конца (маркера [FF D9]) закодированные данные.
Вычисления
Файлы и папки
Чтобы не сваливать все файлы в одну кучу (а на самых первых компьютерах было именно так), придумали папки — это такие виртуальные коробки, внутри которых могут храниться файлы и другие папки.
Если удалить папку, то удалятся все файлы и папки, которые лежали внутри неё. А если папку переместить на новое место — то всё её содержимое тоже переедет вместе с ней.
Ещё есть такое понятие, как «путь к файлу». Это означает последовательность всех папок, которые нужно пройти, чтобы добраться до нужного файла. Если у нас файл «Отчёт 2022.doc» лежит в папке «Отчёты», а «Отчёты» лежат в папке «Работа» на диске D, то полный путь к файлу будет выглядеть так:
👉 Папка — это способ организации файлов, придуманный специально для человека. Компьютер и без папок может запомнить, где какой служебный файл у него лежит.
Маркер [FF DB]: DQT — таблица квантования
- [00 43] Длина: 0x43 = 67 байт
- [0_] Длина значений в таблице: 0 (0 — 1 байт, 1 — 2 байта)
- [_0] Идентификатор таблицы: 0
Оставшимися 64-мя байтами нужно заполнить таблицу 8x8.
Приглядитесь, в каком порядке заполнены значения таблицы. Этот порядок называется zigzag order:
Конец
Вообще я не специалист по JPEG, поэтому вряд ли смогу ответить на все вопросы. Просто когда я писал свой декодер, мне часто приходилось сталкиваться с различными непонятными проблемами. И когда изображение выводилось некорректно, я не знал где допустил ошибку. Может неправильно проинтерпретировал биты, а может неправильно использовал ДКП. Очень не хватало пошагового примера, поэтому, надеюсь, эта статья поможет при написании декодера. Думаю, она покрывает описание базового метода, но все-равно нельзя обойтись только ей. Предлагаю вам ссылки, которые помогли мне:
Доброго времени суток!
Вам когда-нибудь хотелось узнать как устроены файлы PNG? Нет? А я все равно расскажу.
Формат PNG(Portable Network Graphics) был изобретен в 1995 году, чтобы стать заменой GIF, а уже в 1996, с выходом версии 1.0, он был рекомендован W3C, в качестве полноправного сетевого формата. На сегодняшний день PNG является одним из основных форматов веб-графики.
Под катом вы найдете общее описание строения PNG-файла, некоторое количество картинок-схем, препарирование в hex-редакторе, и, конечно, ссылку на спецификацию.
Общее строение
Структура PNG в самом общем виде представлена на следующем рисунке.
То есть файл состоит из подписи и некоторого количества блоков(чанков, chunks), каждый из которых несет в себе некоторую информацию (спасибо КО!). Но почему подпись нельзя считать одним из чанков? Давайте разберемся поподробнее.
Подпись файла
- 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 секций.
Разберем эти секции по порядку.
Длина
Ну, с длиной вроде все ясно. Просто числовое значение длины блока данных.
Тип (имя)
- Регистр первого символа определяет является ли данный чанк критическим(верхний регистр) или вспомогательным(нижний регистр). Критические чанки должны распознаваться каждым декодером. Если декодер встречает критический чанк, тип которого не может распознать, он обязан завершить выполнение с ошибкой.
- Регистр второго символа задает «публичность»(верхний регистр) или «приватность»(нижний регистр) чанка. «Публичные» чанки — официальные, задокументированные, распознаваемые большинством декодеров. Но если вдруг вам для каких-то своих нужд понадобится кодировать специфическую информацию, то просто в имени чанка сделайте второй символ маленьким.
- Регистр третьего символа оставлен для будущих свершений. Предполагается, что он будет использоваться для дифференциации различных версий стандарта. Для версий 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-32. Кстати на днях был топик о ее подсчете в Windows.
Минимальный PNG
С общей структурой разобрались. Теперь разберем содержание обязательных чанков. Но какие из них обязательные (не критические, критические обязаны распознаваться декодером, а не присутствовать в каждом файле), и как выглядит минимальный PNG-файл? А вот как:
- Ширина, 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 байт
Сигнализирует о конце файла, блок данных этого чанка не содержит ничего.
Содержит данные, закодированные, в соответствии с полем метода сжатия в заголовке. Алгоритм декодирования выходит за рамки данной статьи (однако если будут желающие, может появиться в следующей), но в довольно хорошо (и по-русски) описан здесь.
Таким образом, простейший PNG-файл (на примере ) выглядит следующим образом.
Заключение
При написании данной статьи я ставил своей задачей дать читателю общие знания о строении PNG-файла, для более глубокого понимания рекомендуется читать спецификации.
Графический файл состоит из двух основных частей: заголовка и собственно данных. В начале заголовка стоят несколько числовых значений, которые указывают спецификацию файла (TIF, BMP и т.д.). В англоязычной литературе их называют «магическими числами».
Все программы обработки изображений различают форматы файлов не по расширениям, а по «магическим числам». Поэтому, в принципе, например, TIF-файлу можно дать любое название, что никак не отразится на возможности его считывания. Исключением из этого правила являются фото-CD файлы, которые не имеют ни магических чисел, ни обычного заголовка.
За «магическим числом» следует основное содержание заголовка, содержащее общие сведения о файле, в том числе, высоту и ширину изображения, его тип (цветное палитровое/«в искусственных цветах» или монохромное полутоновое/«двухградационное»), с какого места начинаются в файле видеоданные, использовалось ли сжатие данных и т.д. Если файл содержитпалитровое изображение, то после заголовка в большинстве случаев (но не всегда!) следует таблица цветов, в соответствии с которой элементам изображения присваиваются значения RGB-троек.
Далее записываются видеоданные. Способ их хранения зависит от типа изображения и формата файла. Поэтому, создание универсальных программ считывания и записи основных графических форматов является нетривиальной задачей. Данные (структура данных), называемые файловыми элементами, подразделяются на три категории: поля, теги и потоки. Полем называется структура данных в графическом файле, имеющая фиксированный размер. Фиксированное поле может иметь не только фиксированный размер, но и фиксированную позицию в файле. Тег представляет собой структуру данных, размер и позиция которой изменяются от файла к файлу. Поля и теги спроектированы таким образом, чтобы помочь программе обработки изображений получить быстрый доступ к нужным данным. Если позиция в файле известна, то программа получает доступ к ней непосредственно, без предварительного чтения промежуточных данных. Файл, в котором данные организованы в виде потока, не дает таких возможностей и должен читаться последовательно. Поток позволяет поддерживать блоки данных переменной длины. Теоретически могут существовать «чистые» файлы фиксированных полей (содержащие только фиксированные поля), «чистые» теговые и «чистые» потоковые файлы. Однако реально такие файлы большая редкость. Чаще применяются комбинации двух и более элементов данных. Так, известные форматы TIFF и TGA используют и теги, и фиксированные поля, а файлы формата GIF - фиксированные поля и потоки.
Простейшим способом организации пиксельных значений в растровом файле является использованиестрок развертки. В таком случае, пиксельные данные в файле будут представлять собой последовательности наборов значений, где каждый набор будет соответствовать строке изображения (рис. 6.37). Несколько строк представляются несколькими наборами, записанными в файле от начала до конца. Этот метод является общим при сохранении данных изображений организованных в строки.
Несмотря на то, что векторные файлы значительно отличаются друг от друга, большинство из них также имеет стандартную базовую структуру (рис. 6.38). Непосредственно векторные данные записываются очень компактно. Так, например, в формате ASCII, три элемента изображения (окружность синего цвета, черная прямая и красный прямоугольник), могут быть записаны следующим образом: «CIRCLE, 40, 100, 100, BLUE»; «50, 136, 227, BLACK»; «RECT, 80, 65, 25, 78, RED». Здесь цифрами обозначены координаты характерных точек (например, центра тяжести) и размеры характерных линий (например, радиуса). Замкнутые линии векторных изображений могут быть заполнены цветом, который, в общем случае, не зависит от цвета контура элемента. Таким образом, каждый элемент изображения связан с двумя или более цветами, один из них задан для контура элемента, а остальные - для заполнения. Цвета заполнения, в частности, могут быть прозрачными. Если не принимать в расчет палитру и информацию об атрибутах, можно сказать, что размер векторного файла прямо пропорционален количеству содержащихся в нем объектов. Это специфическая особенность векторных файлов, поскольку размер растрового файла не зависит от сложности описанного в нем изображения (на него может повлиять только способ сжатия данных).
В завершении приведем краткий обзор основных графических форматов, использующихся в СТЗ. Наиболее простым форматом уже много лет является PCX-формат. Его основное достоинство, связанное с наглядностью представления видеоданных в структуре файла, привело к появлению многочисленных программ обработки изображений именно из PCX-формата. Самым распространенным, пожалуй, является TIF-формат, называемый также теговым форматом. В нем можно хранить все типы изображений и каждая программа обработки должна включать процедуры чтения и записи TIF-файлов. Недостатком TIF-формата является его сложность, что приводит к возникновению проблем со сжатием изображений и совместимостью файлов. Известный формат BMP, разработанный для системы Windows, широко используется в настоящее время в графических системах, хотя и имеет ряд недостатков, связанных с организацией заголовков файлов. Формат TGA (Targa) обеспечивает очень надежное кодирование видеоданных и практически исключает несовместимость между программами. Недостаток этого формата связан с тем, что разрешение изображения в файле не запоминается. Наибольшее число библиотек изображений создано в GIF-формате, разработанном фирмой Compuserve. Его задачей являлось обеспечение максимального сжатия видеоданных при их записи в память. Он эффективен при сохранении палитровых изображений, содержащих максимум 256 цветов в максимально компактной форме.
Видеофайлы часто имеют очень большой объем, и поэтому во всех перечисленных форматах они подвергаются сжатию либо автоматически, либо путем выбора соответствующей функции. Однако, применяемые при этом методы не очень эффективны, особенно если речь идет о записи изображений в естественных цветах. В этом случае весьма полезен формат JPEG, в котором сжатие данных производится методом дискретного косинусного преобразования (ДКП).
Обзор некоторых распространенных форматов хранения изображений в СТЗ представлен в табл. 6.15
Когда мы говорим о компьютерах, то знаем, что на нём хранятся файлы, а в этих файлах — какие-то данные: музыка, видео, тексты и т. д. Но для компьютера всё немного иначе и сложнее. Сейчас объясним.
Эта статья — часть цикла об устройстве компьютера для новичков. Покажите её своим родителям или друзьям-гуманитариям, если им нужно объяснить, что такое файл. Если вы хотите чего-то посложнее, почитайте нашу серию статей про векторы и матрицы.
Закодированные данные
Последующие значения нужно рассматривать как битовый поток. Первых 33 бит будет достаточно, чтобы построить первую таблицу коэффициентов:
YCbCr в RGB
4 матрицы Y, и по одной Cb и Cr, так как мы прореживали каналы и 4 пикселям Y соответствует по одному Cb и Cr. Поэтому вычислять так: YCbCrToRGB(Y[y,x], Cb[y/2, x/2], Cr[y/2, x/2]):
Вот полученные таблицы для каналов R, G, B для левого верхнего квадрата 8x8 нашего примера:
Нахождение AC-коэффициентов
1) Аналогичен п. 1, нахождения DC коэффициента. Продолжаем читать последовательность:
2) Берем значение узла. Если оно равно 0, это означает, что оставшиеся значения матрицы нужно заполнить нулями. Дальше закодирована уже следующая матрица. В нашем случае значение узла: 0x31.
- Первый полубайт: 0x3 — именно столько нулей мы должны добавить в матрицу. Это 3 нулевых коэффициента.
- Второй полубайт: 0x1 — длина коэффициента в битах. Читаем следующий бит.
Читать AC-коэффициенты нужно пока не наткнемся на нулевое значение кода, либо пока не заполнится матрица.
В нашем случае мы получим:
Вы заметили, что значения заполнены в том же зигзагообразном порядке? Причина использования такого порядка простая — так как чем больше значения v и u, тем меньшей значимостью обладает коэффициент Svu в дискретно-косинусном преобразовании. Поэтому, при высоких степенях сжатия малозначащие коэффициенты обнуляют, тем самым уменьшая размер файла.
Аналогично получаем еще 3 матрицы Y-канала…
- DC для 2-ой: 2 + (-4) = -2
- DC для 3-ой: -2 + 5 = 3
- DC для 4-ой: 3 + (-4) = -1
Теперь порядок. Это правило действует до конца файла.
… и по матрице для Cb и Cr:
Что может храниться в файле
Файл — это просто последовательность байтов на диске, а значит, туда можно записать что угодно:
- фильмы,
- музыку,
- отчёты,
- таблицы,
- фотографии,
- игры,
- драйверы,
- библиотеки для языка разработки.
Главное в файлах не то, что лежит внутри, а как компьютер может с этим работать и какие программы запустить, чтобы файл открылся. Если скинуть на компьютер с Windows фотографии, сделанные на последний айфон в специальном формате, то без дополнительных программ их посмотреть не получится.
Поэтому самое ценное в файлах — чтобы их можно было открыть и посмотреть. Без этого файл так и останется последовательностью нулей и единиц на диске.
Имя и расширение
Название файла чаще всего состоит из имени и расширения, которые отделяются друг от друга точкой:
Но на самом деле название файла может быть и без расширения, и без точки или вообще начинаться с точки, как .htaccess.
Компьютеру на самом деле без разницы, есть ли у файла расширение или нет. Единственное, зачем оно нужно, — чтобы и компьютер, и человек понимали, какие данные в нём могут храниться и в какой программе нужно открыть этот файл. Для этого компьютер создаёт таблицу расширений и приложений — в ней написано, файлы с каким расширением открывать в каких программах.
👉 В разных операционных системах свои требования к названию файла: в Windows нельзя создать файл .con, а в MacOS это можно сделать без проблем.
Маркер [FF C0]: SOF0 — Baseline DCT
Этот маркер называется SOF0, и означает, что изображение закодировано базовым методом. Он очень распространен. Но в интернете не менее популярен знакомый вам progressive-метод, когда сначала загружается изображение с низким разрешением, а потом и нормальная картинка. Это позволяет понять что там изображено, не дожидаясь полной загрузки. Спецификация определяет еще несколько, как мне кажется, не очень распространенных методов.
- [00 11] Длина: 17 байт.
- [08] Precision: 8 бит. В базовом методе всегда 8. Это разрядность значений каналов.
- [00 10] Высота рисунка: 0x10 = 16
- [00 10] Ширина рисунка: 0x10 = 16
- [03] Количество каналов: 3. Чаще всего это Y, Cb, Cr или R, G, B
- [01] Идентификатор: 1
- [2_] Горизонтальное прореживание (H1): 2
- [_2] Вертикальное прореживание (V1): 2
- [00] Идентификатор таблицы квантования: 0
- [02] Идентификатор: 2
- [1_] Горизонтальное прореживание (H2): 1
- [_1] Вертикальное прореживание (V2): 1
- [01] Идентификатор таблицы квантования: 1
- [03] Идентификатор: 3
- [1_] Горизонтальное прореживание (H3): 1
- [_1] Вертикальное прореживание (V3): 1
- [01] Идентификатор таблицы квантования: 1
Находим Hmax=2 и Vmax=2. Канал i будет прорежен в Hmax/Hi раз по горизонтали и Vmax/Vi раз по вертикали.
Файл и документ — это одно и то же?
Файлами называют вообще любые последовательности байтов на диске, у которых есть имя и адрес. Если файл зашифрован, не открывается, внутри него сбои или пустота — это всё равно файл.
Документом называют файл, в котором лежит что-то полезное для пользователя, что он может открыть и с чем может осмысленно взаимодействовать. Например, ваша курсовая работа в формате Word — для вас это документ, а для компьютера — файл.
Для сравнения, системная библиотека программы Microsoft Word — это не документ, а просто файл. Вы не можете его открыть, но его использует программа Word для работы.
Нахождение DC-коэффициента
1) Читаем последовательность битов (если встретим 2 байта [FF 00], то это не маркер, а просто байт [FF]). После каждого бита сдвигаемся по дереву Хаффмана (с соответствующим идентификатором) по ветви 0 или 1, в зависимости от прочитанного бита. Останавливаемся, если оказались в конечном узле.
2) Берем значение узла. Если оно равно 0, то коэффициент равен 0, записываем в таблицу и переходим к чтению других коэффициентов. В нашем случае — 02. Это значение — длина коэффициента в битах. Т. е. читаем следующие 2 бита, это и будет коэффициент:
3) Если первая цифра значения в двоичном представлении — 1, то оставляем как есть: DC = . Иначе преобразуем: DC = -2^+1 . Записываем коэффициент в таблицу в начало зигзага — левый верхний угол.
Что такое файл
С точки зрения компьютера файл — это последовательность байтов на жёстком диске. Если представить жёсткий диск на 100 гигабайт как последовательность из 100 миллиардов байт, то файл будет занимать сколько-то из этих байтов на диске. Вот картинка для понимания:
Эта последовательность байтов необязательно идёт друг за другом — файл может состоять из нескольких фрагментов, которые находятся в разных частях диска:
Все остальные файлы хранятся точно так же — одним или несколькими фрагментами на диске. Чтобы компьютер знал, какой файл состоит из каких фрагментов, он часть памяти отводит на таблицу файлов. В ней он хранит данные обо всех файлах на диске:
Чтение файла
Файл поделен на секторы, предваряемые маркерами. Маркеры имеют длину 2 байта, причем первый байт [FF]. Почти все секторы хранят свою длину в следующих 2 байта после маркера. Для удобства подсветим маркеры:
Папка — это тоже файл
Мало кто знает, но папка — это тоже на самом деле файл, просто специальный, со своими задачами. Внутри этого файла записана информация о том, какие файлы относятся к этой папке. А раз папка — это тоже файл, то когда мы вкладываем папку друг в друга, компьютер всего лишь добавляет запись про один файл в другой.
Обратное дискретно-косинусное преобразование
Формула не должна доставить сложностей. Svu — наша полученная матрица коэффициентов. u — столбец, v — строка. Cx = 1/√2 для x = 0, а в остальных случаях = 1. syx — непосредственно значения каналов.
Приведу результат вычисления только первой матрицы канала Y (после обязательного округления):
Ко всем полученным значениям нужно прибавить по 128, а затем ограничить их диапазон от 0 до 255:
Например: 138 → 266 → 255, 92 → 220 → 220 и т. д.
Квантование
Вы помните, что матрица проходит этап квантования? Элементы матрицы нужно почленно перемножить с элементами матрицы квантования. Осталось выбрать нужную. Сначала мы просканировали первый канал. Он использует матрицу квантования 0 (у нас она первая из двух). Итак, после перемножения получаем 4 матрицы Y-канала:
… и по матрице для Cb и Cr.
Немного теории
- Обычно изображение преобразуется из цветового пространства RGB в YCbCr.
- Часто каналы Cb и Cr прореживают, то есть блоку пикселей присваивается усредненное значение. Например, после прореживания в 2 раза по вертикали и горизонтали, пиксели будут иметь такое соответствие:
- Затем значения каналов разбиваются на блоки 8x8 (все видели эти квадратики на слишком сжатом изображении).
- Каждый блок подвергается дискретно-косинусному преобразованию (ДКП), являющемся разновидностью дискретного преобразования Фурье. Получим матрицу коэффициетов 8x8. Причем левый верхний коэффициент называется DC-коффициентом (он самый важный и является усредненным значением всех значений), а оставшиеся 63 — AC-коэффициентами.
- Получившиеся коэффициенты квантуются, т.е. каждый умножается на коэффициент матрицы квантования (каждый кодировщик обычно использует свою матрицу квантования).
- Затем они кодируются кодами Хаффмана.
Закодированные данные располагаются поочередно, небольшими частями:
Каждый блок Yij, Cbij, Crij — это матрица коэффициентов ДКП (так же 8x8), закодированная кодами Хаффмана. В файле они располагаются в таком порядке: Y00Y10Y01Y11Cb00Cr00Y20.
Читайте также: