На данный момент времени существует огромное количество различных форматов графических файлов, предназначенных для самых разнообразных целей и применений. Познакомимся с основными, наиболее распространенными из них.
Формат TIFF (Tagged Image File Format) изначально был создан в качестве универсального формата для хранения сканированных изображений с цветовыми каналами. Важным достоинством этого формата является его переносимость на разные платформы. На сегодняшний день TIFF является одним из самых распространенных и надежных, его поддерживают практически все программы так или иначе связанные с графикой. В этом формате доступен весь диапазон цветовых моделей от монохромной до RGB, CMYK и дополнительных цветов Pantone. Кроме того, TIFF позволяет в случае необходимости сохранять разнообразную дополнительную информацию о изображении (контуры, альфа-каналы и т.п.). В формате TIFF может быть использовано сжатие по алгоритму LZW.
TIFF является лучшим выбором при хранении изображений с высоким качеством, предназначенных для дальнейшего анализа и обработки, импорте растровой графики в векторные программы, издательские системы и т.п.
Независящий от аппаратного обеспечения формат GIF (Graphics Interchange Format) был разработан в 1987 году (модификация GIF87a) фирмой CompuServe для передачи растровых изображений по сетям. В 1989-м спецификация формата была доработана (модификация GIF89a): в него были добавлены поддержка прозрачности и анимации изображений. Формат GIF использует LZW-компрессию и имеет ограниченную палитру в 256 цетов. Таким образом, его можно назвать форматом хранения изображений без потерь. Однако, это утверждение справедливо только в том случае, если исходное изображение имеет от 2 до 256 цветов (если же количество цветов более 256, то часть из них будет утрачена).
GIF используется как один из основных растровых форматов для представления графической информации в интернете.
Формат JPEG использует одноименный алгоритм сжатия для компрессии изображений. Он предназначен для хранения полноцветной графики с высоким коэффициентом сжатия без заметной для глаза человека потери качества. При этом, как было сказано выше, изображение никогда не может быть полностью восстановлено в исходном виде. При сохранении графики в формате JPEG можно управлять параметром качества (quality), измеряемым в относительных единицах – чаще всего от 0 (максимальное сжатие) до 100 (максимальное качество).
Формат JPEG следует использовать для хранения полноцветных изображений (в первую очередь фотографических и т.п.), которые не предназначены для дальнейшей обработки. Его не следует применять для хранения изображений с небольшим количеством цветов (менее 256) и с резким переходами между цветами, т.к. это может привести к проявлению различимых глазом дефектов.
Формат BMP (Windows Device Independent Bitmap, от BitMaP – битовая карта) является собственным растровым форматом операционной системы Windows. Способен хранить изображения как в индексированном виде (с палитрой до 256 цветов), так и полноцветные RGB-изображения (с глубиной цвета 24 бита). Возможно применение алгоритма сжатия RLE. Использование данного формата ограничено тем, что он не поддерживается графическими программами под управлением большинства операционных систем кроме Windows. Используется в основном для хранения картинок при организации пользовательских интерфейсов.
Как уже говорилось, в рамках данного курса обработка изображений будет проводиться средствами библиотеки IPL. При этом, в качестве формата графических файлов для хранения исходных изображений, предназначенных для проведения дальнейшей обработки, предлагается использовать BMP. Причинами такого выбора является возможность хранений полноцветных изображений без потерь и хорошо известная, простая структура. К сожалению, библиотека IPL не располагает возможностями по работе с какими бы то ни было графическими файлами. Поэтому, прежде чем переходить к рассмотрению процедур обработки изображения, рассмотрим структуру формата BMP, и приведем пример чтения графического файла в этом формате.
Структура данных файла в формате BMP имеет следующий вид:
BITMAPFILEHEADER
BITMAPINFOHEADER
RGBQUAD array
Color-index array
В начале идет структура заголовка файла (BITMAPFILEHEADER), имеющая следующий вид:
typedef struct tagBITMAPFILEHEADER { WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; } BITMAPFILEHEADER, *PBITMAPFILEHEADER;
bfType
Тип файла. Должен быть "BM".
bfSize
Размер файла в байтах.
bfReserved1, bfReserved2
Зарезервированные поля.
bfOffBits
Смещение битового массива относительно начала файла.
Далее следует структура информационного заголовка (BITMAPINFOHEADER), имеющая следующий вид:
typedef struct tagBITMAPINFOHEADER { DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; } BITMAPINFOHEADER, *PBITMAPINFOHEADER;
biSize
Размер структуры.
biWidth, biHeight
Ширина и высота изображения в пикселах соответственно.
biPlanes
Количество плоскостей. Использовалось ранее при небольшой глубине фвета. Сейчас, при числе цветов 256 и больше, оно всегда равно 1. Сохранено для совместимости.
biBitCount
Глубина цвета в битах на пиксель.
biCompression
Тип сжатия. Если компрессия не используется, то флаг имеет значенине BI_RGB. Возможны варианты BI_RLE8, BI_RLE4, BI_BITFIELDS и BI_JPEG.
biSizeImage
Размер изображения в байтах. Если изображение не сжато (то есть поле biCompression установлено в BI_RGB), то здесь может быть записан 0.
biXPelsPerMeter, biYPelsPerMeter
Горизонтальное и вертикальное разрешение (в пикселях на метр) соответственно. Важно в первую очередь для устройства, на которое будет выводиться битовый массив.
biClrUsed
Количество используемых цветов кодовой таблицы. Если значение поля равно 0, то используется максимально возможное количество цветов, которые разрешены значением поля biBitCount.
biClrImportant
Количество основных цветов. Определяет число цветов, необходимых для отображения изображения. Если значение поля равно 0, то используются все цвета.
За информационным заголовком следует таблица цветов, представляющая собой массив структур RGBQUAD (4-байтовых полей). Каждое поле соответствует своему цвету в палитре, а три байта из четырех – синей, зеленой и красной компонентам этого цвета. Последний байт каждого поля зарезервирован и должен быть равен 0.
После таблицы цветов находятся данные изображения, которое по строкам растра записано снизу вверх, а внутри строки – слева направо. Длина каждой строки выровнена на границу в 4 байта (при длине строки, некратной четырем, она дополняется нулями).
Теперь рассмотрим пример реализации чтения графических файлов в формате BMP приложением, построенным на основе MFC с использованием библиотеки IPL:
//------------------------------------------------------------------------------ // Чтение и размещение изображения void CTestDoc::Serialize(CArchive& ar) { if(ar.IsStoring()) { } else { // Если в памяти уже имеется изображение, то ее необходимо освободить if(m_img != NULL) { iplDeallocate(m_img, IPL_IMAGE_ALL); } // Чтение структуры данных файла BMP BITMAPINFOHEADER* bmphdr = ipLoad(ar.GetFile()->GetFilePath());