суббота, 19 ноября 2016 г.

Форматы графических файлов

Все форматы графических файлов делятся на растровые и векторные. Различия между этими двумя типами велики.
Векторные форматы представляют изображение как набор графических примитивов (геометрических фигур): точек, линий, окружностей... Соответственно и используются они для представления схем, чертежей, графиков, а для представления рисунков и фотографий они непригодны.
Особенность векторного представления в том, что изображение легко перемасштабировать без потери качества, также легко накладывать части изображения друг на друга, редактировать уже нарисованные объекты. Вообще векторное представление требует от приложения-редактора или приложения-просмотрщика некоторой сложности, так как оно должно реализовывать много специфических алгоритмов, например нахождение точек пересечения различных линий.
Векторных форматов много, они создаются под особенности конкретного приложения, поэтому здесь не буду подробно об этом писать. Формат, который заслуживает особого внимания - это DXF (формат обмена чертежами).

Файл DXF - это текстовый файл, хранящий информацию о графичеких примитивах и параметрах чертежа, обычно используется для обмена данными между различными CAD-системами. Формат устроен так, что очень легко выделить из большого файла только нужную информацию.
В программировании под Windows также используется еще один тип векторных файлов - метафайлы. Метафайлы хранят последовательности команд для графического устройства на рисование определенных объектов. Эти команды соответствуют определенным вызовам функций Windows API. Записав в метафайл протокол вызова функций, затем можно быстро вывести ее на графическое устройство. Существует 3 типа метафайлов:
  • Windows Metafile Format (WMF)
  • Enhanced Metafile (EMF)
  • EMF+

Форматы WMF и EMF содержат вызовы к обычному интерфейсу GDI (Graphics Device Interface), а EMF+ содержит вызовы методов объектно-ориентированного интерфейса GDI+ (именно он используется в C# и VisualBasic.NET). WMF - устаревший формат.

Растровые графические форматы. Методы кодирования

Растровые форматы более распространены. Многие приложения и веб-сайты используют именно растровые изображения.
В растровом представлении изображение представляется как набор небольших растрэлементов (точек, пикселей). Соответственно, файл хранит информацию о цвете каждой точки. Поскольку для больших изображений это может потребовать большого объема памяти, применяются методы сжатия - они определяют сущность каждого формата. Растровые изображения используются для представления фотографий, картинок, иногда - схем и графиков. Благодаря наличию удобных графических библиотек, многие приложения могут использовать растровую графику, а не только профессиональные графичекие редакторы.

Каждый растровый формат поддерживает определенные форматы пикселей, т.е. способы представления информации о цвете конкретной точки (методы кодирования информации о цвете). Формат пикселя характеризуется глубиной цвета - количесвом бит, приходящихся на пиксель или клоичество возможных цветов одного пикселя. Простейший формат пикселей - монохромный, где каждый пиксель кодируется битом (может иметь только два значения). Раньше часто применялись форматы, основанные на палитрах. То есть вместе с изображением хранилась палитра - цветовая таблица; а само изображение состояло из индексов элементов этой таблицы. Например, палитра состоит из четырех цветов: белый, красный, зеленый, синий. Для того чтобы закодировать четыре цвета достаточно log2(4)=2 бита. Соотоветственно глубина цвета равна 2 бита. Если цветов 256 - глубина цвета равна 8 бит; этот вариант используется некоторыми устаревшими приложениями.

Если изображение состоит из оттенков серого, то каждый пиксель можно кодировать относительной интенсивностью света. Например если есть 256 градаций от черного до белого, то глубина цвета равна 8 бит, а для представления пикселя используется 1 байт.
В настоящее время более популярен формат пикселя RGB, где каждый пиксель кодируется 3 числами: красной, зеленой и синей составляющей. Этот формат уже не требует хранения палитры. Все составляющие цвета в данном случае равнозначны - это важно; и выделить под одну из составляющих больше бит, чем под две другие не имеет смысла. Обычно для каждой составляющей используется 1 байт - итоговая глубина цвета равна 24 бит. Иногда для дополнения 24 бит до 32 бит - размера слова в арзитектуре процессоров х86 - в четвертый байт запихивают данные о прозрачности пиксела - так назваемый альфа-канал (тогда формат пикселя называется RGBA) или просто заполняют его нулевым байтом. Так что словосочетание "глубина цвета 32 бит" не всегда значит, что качество лучше чем при глубине цвета 24 бит. К слову сказать, библиотека GDI использует формат в основном формат RGB, и на монитор соответственно выводится реальные данные с глубиной цвета 24 бит. Поэтому окна и кнопки отображаются именно с такой глубиной цвета, даже если на мониторе установлен режим High Color (32 bit). Реальная глубина цвета 32 бита возможна, если данные поступают от DirectX - например при просмотре фильмов (об этом дальше). Но существуют серьезные опасения что глубина цвета 32 бита (шутка ли - 2 в 32 степени цветов!) - вообще рекламный трюк производителей мониторов.

Существует еще несколько вариаций на тему RGB с другими цветами - здесь их разбирать не буду. Более интересен другой формат пикселей, который часто используется DirectX. Но сначала расскажу о представлении цвета в аналоговом телевидении. Телевизионное изображение тоже ведь состоит из дискретных растрэлементов, хоть само кодирование и аналоговое. В черно-белом телевидении все ясно - кодируем интенсивность цвета. А вот в цветном телевидении все интереснее. Первоначально ставилась задача сохранить совместимость цветного телевидения со старым оборудованием, то есть чтобы оно вообще хоть что-то отображало. Формат RGB тут конечно не подходит, так как старое оборудование не смогло бы выделить из такого сигнала информацию об интенсивности света.
Решением стал формат с неравнозначными составляющими сигнала: сигнал содержал 1 яркостную составляющую и 2 цветовые составляющие. В результате черно-белые телевизоры благополучно отображают яркостную состовляющую, не подозревая о наличии двух других. А цветные телевизоры используют все три, и отображают цветное изображение (аналоговое).
Способ кодирования оказался настолько удачным, что стал использоваться и в цифровом варианте - так появился формат YUV. Для цифровой графики конечно самым важным приемуществом оказалась не совместимость, а возможность увеличить качество при незначительном увеличении размера. Чтобы в два раза увеличить качество в формате RGB, надо было увеличить глубину цвета в два раза - 48 бит. В формате YUV мы можем увеличить в 2 раза объем данных под яркостную составляющую, а цветовые составляющие отавить как есть. При этом качество увеличится почти в 2 раза, а объем возрастет всего на 30%. Это возможно, потому что яркостная составляющая хранит куда больше информации о цвете, чем цветовые, она важнее - не зря черно-белые телевизоры только ее и используют. Поэтому этот формат часто используется в видеозаписях, где надо увеличить качество с экономией размера. При хранении изображений он не используется.

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

Основные форматы растровой графики


1.Device Independent Bitmap (DIB,BMP) - аппаратно-независимое изображение

Это стандартный формат в Windows. Широко используется во внутренней работе приложений и операционой системы. Он обычно не использует сжатие. Поддерживает почти любые форматы пекселей: монохромные, оттенки серого, основанные на палитре и RGB.
Возможные значения глубины цвета: 1, 4, 8, 16, 24, 32, 64. Может хранить и альфа-канал. Недостатки - большой объем файлов и невозможность хранения информационных тегов.

Официальная спецификация:http://msdn.microsoft.com/en-us/library/dd183391(VS.85).aspx
Описания формата на русском языке: http://jenyay.net/Programming/Bmp

2.Graphics Interchange Format (GIF)
GIF часто используется для изображений на веб-страницах. Хорошо работает для линейных рисунков (схем), рисунков с блоками одинакового цвета и изображений с резкими границами между цветами. (И вообще для изображений имеющих какую-то закономерность: например геометрических узоров). GIF использует сжатие без потерь (алгоритм LZW). Один из цветов на изображении может быть назначен "прозрачным", чтобы изображение накладывалось на фон веб-страницы. Несколько изображений GIF в одном файле образуют анимацию - тоже факт обеспечивающий популярность этому формату. Максимальная глубина цвета - 8 бит, так что больше 256 цветов мы закодировать не можем, и для фотографий этот формат не подходит.

Спецификация на русском языке: http://livegif.ru/articles/6_1.html

3.Joint Photographic Experts Group(JPEG)
JPEG - это схема сжатия, отлично подходящая для фотографий кошечек, собачек, цветов и других природных объектов. При сжатии происходит незначительная потеря информации (качества), но для человека она может быть и не заметна. Уровень сжатия в JPEG настраиваемый. JPEG может иметь глубину цвета 24 бит для цветных и 8 бит для изображений в оттенках серого. JPEG не поддерживает прозрачность и анимацию. Также JPEG плохо работает для линейных чертежей, блоков однородного цвета и резких границ. Потеря качества в этом случае будет сильно заметна. JPEG имеет тенденцию размывать границы.
Два файловых формата используют JPEG -сжатие: JPEG File Interchange Format (JFIF) и Exchangeable Image File (Exif). Второй формат отличается тем, что позволяет сохранять вместе с рисунком различные метаданные. Он используется цифровыми камерами.
Существует также способ сжатия видео - MotionJPEG, он часто используется в видозаписях, снятых цифровыми фотоаппапратами.

Официальная страница: http://www.jpeg.org/
Спецификация формата JFIF: http://www.martinreddy.net/gfx/2d/JPEG.txt

4. Portable Network Graphics (PNG)
Это улучшение формата GIF. Тоже использует сжатие без потерь - алгоритм Deflate. Может использовать широкий набор значений глубины цвета 8, 24, 48 и для изображений в оттенках серого: 1, 2, 4, 8, or 16. Также поддерживает хранение альфа-канала для каждого пиксела. Файлы PNG могут также содержать информацию о гамма-коррекции чтобы все устройства их правильно отображали: это особенно важно для "сетевой" графики.

Спецификация: http://www.w3.org/TR/PNG/

5. Tagged Image File Format (TIFF)
Это гибкий и расширяемый формат. Разрядность: 8 , 16, 32 или 64 бит на канал. Может использовать широкий набор форматов пикселей и алгоритмов сжатия (обычно используется LZW). TIFF-файл может быть многостраничным. Поддерживает информационные теги. Причем набор тегов может быть расширен путем добавления новых тегов.

6. Truevision TGA
Это сравнительно редкий формат. Иногда используется в компьютерных играх для хранения текстур. Возможная глубина цвета 1-32 бита на пиксель. Поддерживает альфа-канал.

Спецификация: http://www.ludorg.net/amnesia/TGA_File_Format_Spec.html

7. Формат RAW
Этот формат обычно используется для промежуточного хранения необработанных данных, полученных с цифровой камеры. Это делается, чтобы избежать потерь качества, как это было бы, если снимок сразу сохраняется в JPEG. Может использовать различные способы сжатия.

Описания других форматов можно найти здесь:

http://www.martinreddy.net/gfx/2d-hi.html

Комментариев нет:

Отправить комментарий