Лабораторная работа № 3 "Обработка растровых изображений" Задание. 1. Разработать набор функций для работы с побитовым изображением, хранящимся в файле формата Windows BMP (описание формата прилагается). (Должны быть реализованы операции чтения изображения из файла, записи изображения в файл, получения цвета пиксела с заданными координатами, изменение цвета пиксела с заданными координатами, вывод изображения на экран). 2. Разработать структуры данных и написать функции для геометричес- ких преобразований побитового изображения (смещение, масштабирование, поворот, произвольное преобразование). 3. Разработать функции фильтрации растровых изображений. Формат файла BMP (BitMap Picture). Машинонезависимое побитовое отображение (device-independent bitmap, DIB) состоит из: -------------------------¬ ¬ ¦Заголовок файла ¦ ¦ BITMAPFILEHEADER +------------------------+ + ¬ ¦Заголовок картинки ¦ ¦ BITMAPINFOHEADER ¦ +------------------------+ - ¦ BITMAPINFO ¦Таблица цветов (палитра)¦ ¦ +------------------------+ - ¦Массив пикселов ¦ L------------------------- Структура BITMAPINFO, определяющая размеры и набор цветов побито- вого отображения, в файле DIB следует сразу за структурой BITMAPFILEHEADER. Массив пикселов представляет собой массив байтов (или битов, или битовых полей - в зависимости от формата, определенного в BITMAPINFOHEADER), определяющих пикселы побитового изображения. Биты в массиве упакованы вместе, но каждая строка развертки должна быть вы- ровнена на границу двойного слова, промежуток между концом строки и началом следующей заполняется нулями. BITMAPFILEHEADER Структура BITMAPFILEHEADER содержит информацию о типе, размере, и фор- мате файла, которая содержит машинонезависимое побитовое отображение (DIB). typedef struct tagBITMAPFILEHEADER { // bmfh WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; } BITMAPFILEHEADER; bfType Сигнатура файла "BM". bfSize Определяет размер, в байтах, файла побитового отобра- жения. bfReserved1 Зарезервировано; должно быть = 0. bfReserved2 Зарезервировано; должно быть = 0. bfOffBits Определяет смещение, в байтах, от структуры BITMAPFILEHEADER до начала битового массива. BITMAPINFO Структура BITMAPINFO содержит информацию о размерах и таблице цветов (палитре) машинонезависимого побитового отображения (DIB). typedef struct tagBITMAPINFO { // bmi BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[1]; } BITMAPINFO; bmiHeader Структура типа BITMAPINFOHEADER, которая содержит ин- формацию о размерах и цветном формате DIB. bmiColors Массив элементов RGBQUAD (см. ниже), определяющий мно- жество цветов в DIB. Цвета в таблице должны следовать в порядке важности. BITMAPINFOHEADER Структура BITMAPINFOHEADER содержит информацию о размерах и цветном формате машинонезависимого побитового отображения (DIB). typedef struct tagBITMAPINFOHEADER{ // bmih DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; } BITMAPINFOHEADER; biSize Определяет количество байтов требуемых структурой. biWidth Определяет ширину побитового отображения, в пикселах. biHeight Определяет высоту побитового отображения, в пикселах. Если biHeight положительно, побитовое отображение является "восходящим": его началом является нижний ле- вый угол. Если biHeight отрицательно, побитовое отображение является "нисходящим": его началом является верхний левый угол. biPlanes Определяет количество плоскостей для целевого устрой- ства. Для машинонезависимых побитовых отображений эта величина должна быть = 1. biBitCount Определяет количество битов для представления каждого пиксела. Значение этого поля может быть 1, 4, 8, 16, 24, или 32: 1 Побитовое отображение монохромное, и таблица цветов (палит- ра) содержит два элемента. Каждый бит в массиве побитового отображения представляет пиксел. Если бит = 0, пиксел отоб- ражается цветом первого элемента таблицы цветов; если бит = 1, пиксель имеет цвет второго элемента таблицы. 4 Побитовое отображение имеет максимум 16 цветов, и таблица цветов (палитра) содержит до 16 элементов. Каждый пиксел в побитовом отображении представлен 4-битовым индексом в па- литре. Например, если первый байт в побитовом отображении - 0x1F, байт представляет два пикселя. Первый пиксел должен быть прорисован цветом, хранящимся во втором элементе табли- цы, а второй - в шестнадцатом элементе таблицы. 8 Побитовое отображение имеет максимум 256 цветов, и таблица цветов (палитра) содержит до 256 элементов. В этом случае, каждый байт в массиве представляет единственный пиксел. 16 Побитовое отображение имеет максимум 2^16 цветов. Если biCompression = BI_RGB, поле bmiColors не используется. Каж- дое слово (2 байта) в массиве побитового отображения пред- ставляет единственный пиксел. Относительные интенсивности красного, зеленого, и синего представлены 5 битами для каж- дого цветного компонента (маска имеет вид xRRRRRGGGGGBBBBB). Если biCompression = BI_BITFIELDS, bmiColors содержит три цветовые маски (каждая размером 4 байта), которые опре- деляют красный, зеленый, и синие компоненты, соответственно, каждого пиксела. Каждое слова (2 байта) в массиве побитово- го отображения представляет единственный пиксель. В Windows 95 поддерживаются только маски вида 5-5-5 (0x7C00, 0x03E0, 0x001F) и 5-6-5 (0xF800, 0x07E0, 0x001F). 24 Побитовое отображение имеет максимум 2^24 цветов, поле bmiColors не используется. Каждый 3-байтовый триплет в мас- сиве побитового отображения представляет относительные ин- тенсивности синего, зеленого, и красного компонента пиксела, соответственно. 32 Побитовое отображение имеет максимум 2^32 цветов. Если biCompression = BI_RGB, не используется. Каждое двойное сло- во (4 байта) в массиве побитового отображения представляет относительные интенсивности синего, зеленого, и красного, соответственно. Старший байт в каждом двойном слове не ис- пользован. В Windows 95 поддерживаются только маски (0x00FF0000, 0x000000FF, 0x0000FF00). biCompression Определяет тип сжатия для сжатого "восходящего" поби- тового отображения (нисходящие DIB не ногут сжиматься). Может принимать одно из следующих значений: BI_RGB Несжатый формат. BI_RLE8 RLE формат (run-length encoding) для побитовых отоб- ражений формата 8 бит на пиксел. BI_RLE4 RLE формат (run-length encoding) для побитовых отоб- ражений формата 4 бит на пиксел. BI_BITFIELDS Определяет, что побитовое отображение не сжимается и, что цветовая таблица (палитра) состоит из трех цветовых масок (в формате двойного слова), которые определяют красный, зеленый, и синие компоненты, соответственно, каждого пиксела. Используется только с изображениями формата 16- и 32-бита на пиксел. biSizeImage Определяет размер битового образа в байтах. Может быть = 0 для побитовых отображений формата BI_RGB. biXPelsPerMeter Определяет горизонтальное разрешение (в пикселях на метр) целевого устройства. Приложение может использо- вать это значение, чтобы выбрать побитовое отображе- ние из нескольких, которое при выводе на конкретном устройстве будет выглядеть наилучшим образом. biYPelsPerMeter Определяет горизонтальное разрешение (в пикселях на метр) целевого устройства. biClrUsed Определяет количество элементов таблицы цветов (палит- ры), которые действительно используются побитовым отображением. Если biClrUsed = 0, побитовое отображение ис- пользует максимальное количество цветов соответствую- щих значению biBitCount (2 ^ biBitCount). Если biClrUsed <> 0 и biBitCount < 16, biClrUsed определяет фактическое количество цветов, поддерживае- мых драйвером устройства. Если biBitCount >= 16, biClrUsed определяет опти- мальный размер таблицы цветов. biClrImportant Определяет количество элементов таблицы цветов (палит- ры), которые считаются важными для отображения побито- вого изображения. Если эта величина = 0, все цвета важные. RGBQUAD Структура RGBQUAD описывает цвет, состоящий из компонент, задающих от- носительные интенсивности красного, зеленого, и синего. typedef struct tagRGBQUAD { // rgbq BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved; } RGBQUAD; rgbBlue Определяет интенсивность синего компонента в цвете. rgbGreen Определяет интенсивность зеленого компонента в цвете. rgbRed Определяет интенсивность красного компонента в цвете. rgbReserved Зарезервировано, должно быть = 0.