Создание BMP-файлов. Структура Bmp-файла




Создание BMP-файлов

Рассмотрим структуру BMP-файлов.

По решению разработчиков формат Bmp-файла не привязан к конкретной аппаратной платформе. Этот файл состоит из четырех частей: заголовка, информационного заголовка, таблицы цветов (палитры) и данных изображения. Если в файле хранится изображение с глубиной цвета 24 бита (16 млн. цветов), то таблица цветов может отсутствовать.

Заголовок файла начинается с сигнатуры «BM», а затем идет длина файла, выраженная в байтах. Следующие 4 байта зарезервированы для дальнейших расширений формата, а заканчивается этот заголовок смещением от начала файла до записанных в нем данных изображения. При 256 цветах это смещение составляет 1078.

Информационный заголовок начинается с собственной длины (она может изменяться, но для 256-цветного файла составляет 40 байт) и содержит размеры изображения, разрешение, характеристики представления цвета и другие параметры.

Ширина и высота изображения задаются в точках растра и пояснений, пожалуй, не требуют.

Количество плоскостей могло применяться в файлах, имеющих небольшую глубину цвета. При числе цветов 256 и больше оно всегда равно 1, поэтому сейчас это поле уже можно считать устаревшим, но для совместимости оно сохраняется.

Глубина цвета считается важнейшей характеристикой способа представления цвета в файле и измеряется в битах на точку. В данном случае она равна 8.

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

Размер изображения — количество байт памяти, требующихся для хранения этого изображения, не считая данных палитры.

Горизонтальное и вертикальное разрешения измеряются в точках растра на метр. Они особенно важны для сохранения масштаба отсканированных картинок. Изображения, созданные с помощью графических редакторов, как правило, имеют в этих полях нули.

Число цветов позволяет сократить размер таблицы палитры, если в изображении реально присутствует меньше цветов, чем это допускает выбранная глубина цвета. Однако на практике такие файлы почти не встречаются. Если число цветов принимает значение, максимально допустимое глубиной цвета, например 256 цветов при 8 битах, поле обнуляют.

Число основных цветов — идет с начала палитры, и его желательно выводить без искажений. Данное поле бывает важно тогда, когда максимальное число цветов дисплея было меньше, чем в палитре Bmp-файла. При разработке формата, очевидно, принималось, что наиболее часто встречающиеся цвета будут располагаться в начале таблицы. Сейчас этого требования практически не придерживаются, т. е. цвета не упорядочиваются по частоте, с которой они встречаются в файле. Это очень важно, поскольку палитры двух разных файлов, даже составленных из одних и тех же цветов, содержали бы их (цвета) в разном порядке, что могло существенно осложнить одновременный вывод таких изображений на экран.

За информационным заголовком следует таблица цветов, представляющая собой массив из 256 (по числу цветов) 4-байтовых полей. Каждое поле соответствует своему цвету в палитре, а три байта из четырех — компонентам синей, зеленой и красной составляющих для этого цвета. Последний, самый старший байт каждого поля зарезервирован и равен 0.

После таблицы цветов находятся данные изображения, которое по строкам растра записано снизу вверх, а внутри строки — слева направо. Так как на некоторых платформах невозможно считать единицу данных, которая меньше 4 байт, длина каждой строки выровнена на границу в 4 байта, т. е. при длине строки, некратной четырем, она дополняется нулями. Это обстоятельство обязательно надо учитывать при считывании файла, хотя, возможно, лучше заранее позаботиться, чтобы горизонтальные размеры всех изображений были кратны 4.

Структура Bmp-файла

Имя Длина Смещение Описание
Заголовок файла (BitMapFileHeader)
Type     Сигнатура "BM"
Size     Размер файла
Reserved 1     Зарезервировано
Reserved 2     Зарезервировано
OffsetBits     Смещение изображения от начала файла
Информационный заголовок (BitMapInfoHeader)
Size     Длина заголовка
Width     Ширина изображения, точки
Height     Высота изображения, точки
Planes     Число плоскостей
BitCount     Глубина цвета, бит на точку
Compression     Тип компрессии (0 - несжатое изображение)
SizeImage     Размер изображения, байт
XpelsPerMeter     Горизонтальное разрешение, точки на метр
YpelsPerMeter     Вертикальное разрешение, точки на метр
ColorsUsed     Число используемых цветов (0 - максимально возможное для данной глубины цвета)
ColorsImportant     Число основных цветов
Таблица цветов (палитра) (ColorTable)
ColorTable     256 элементов по 4 байта
Данные изображения (BitMap Array)
Image Size   Изображение, записанное по строкам слева направо и снизу вверх

 

При работе в Паскале для описания заголовков файла можно использовать следующие типы:

bmFileHeader = record {заголовок файла}

Typf: word; {сигнатура }

Size: longint; {длина файла в байтах}

Res1: word; {зарезервировано}

Res2: word; {зарезервировано}

OfBm: longint; {смещение изображения в байтах (1078)}

end;

bmInfoHeader = record {информационный заголовок}

Size: longint; {длина заголовка в байтах (40)}

Widt: longint; {ширина изображения (в точках)}

Heig: longint; {высота изображения (в точках)}

Plan: word; {число плоскостей (1)}

BitC: word; {глубина цвета (бит на точку) (8)}

Comp: longint; {тип компрессии (0 - нет)}

SizI: longint; {размер изображения в байтах}

XppM: longint; {горизонтальное разрешение}

{(точек на метр - обычно 0)}

YppM: longint; {вертикальное разрешение}

{(точек на метр - обычно 0)}

NCoL: longint; {число цветов}

{(если максимально допустимое - 0)}

NCoI: longint; {число основных цветов}

end;

bmHeader = record {полный заголовок файла}

f: bmFileHeader; {заголовок файла}

i: bmInfoHeader; {информационный заголовок}

p: array[0..255,0..3]of byte; {таблица палитры}

end;

 

 

Виды формата BMP

Все разновидности формата bmp условно можно разделить на два типа: палитровые и беспалитровые. То есть используется в данном с формате палитра или нет. Заметьте, что палитра может быть даже в беспалитровых форматах, только там она не используется. В беспалитровых bmp цвет высчитывается прямо из тех битов, которые идут в файле, начиная с некоторого места. А в палитровых каждый байт описывает один или несколько пикселей, причем значения байта (или битов) - это индекс цвета в палитре. Вид картинки (палитровая или беспалитровая) зависит от того, сколько бит отдается на один пиксель, то есть от значения BitCount структуры BITMAPINFOHEADER.

BitCount Палитровый или беспалитровый формат Максимально возможное количество цветов Примечания
  Палитровый   Двуцветная, заметьте, не обязательно черно-белая, палитровая картинка. Если бит растра (что это такое чуть ниже) сброшен (равен 0), то это значит, что на этом месте должен быть первый цвет из палитры, а если установлен (равен 1), то второй.
  Палитровый   Каждый байт описывает 2 пикселя. Если первый байт в картинке 0x1F, то он соответствует двум пикселям, цвет первого - второй цвет из палитры (потому что отсчет идет от нуля), а второй пиксель - 16-й цвет палитры.
  Палитровый   Один из самых распространенных вариантов. Но в то же время и самых простых. Палитра занимает один килобайт (но на это лучше не рассчитывать). Один байт - это один цвет. Причем его значение - это номер цвета в палитре.
  Беспалитровый 2^16 или 2^15 Это самый запутанный вариант. Начнем с того, что он беспалитровый, то есть каждые два байта (одно слово WORD) в растре однозначно определяют один пиксель. Но вот что получается: битов-то 16, а компонентов цветов - 3 (Красный, Зеленый, Синий). А 16 никак на 3 делиться не хочет. Поэтому здесь есть два варианта. Первый - использовать не 16, а 15 битов, тогда на каждую компоненту цвета выходит по 5 бит. Таким образом мы можем использовать максимум 2^15 = 32768 цветов и получается тройка R-G-B = 5-5-5. Но тогда за зря теряется целый бит из 16. Но так уж случилось, что наши глаза среди всех цветов лучше воспринимают зеленый цвет, поэтому и решили этот один бит отдавать на зеленую компоненту, то есть тогда получается тройка R-G-B = 5-6-5, и теперь мы может использовать 2^16 = 65536 цветов. Но что самое неприятное, что используют оба варианта. В MSDN предлагают для того, чтобы различать сколько же цветов используется, заполнять этим значением поле ColorsUsed из структуры BITMAPINFOHEADER. Чтобы выделить каждую компоненту надо использовать следующие маски. Для формата 5-5-5: 0x001F для синей компоненты, 0x03E0 для зеленой и 0x7C00 для красной. Для формата 5-6-5: 0x001F - синяя, 0x07E0 - зеленая и 0xF800 красная компоненты соответственно.
  Беспалитровый 2^24 А это самый простой формат. Здесь 3 байта определяют 3 компоненты цвета. То есть по компоненте на байт. Просто читаем по структуре RGBTRIPLE и используем его поля rgbtBlue, rgbtGreen, rgbtRed. Они идут именно в таком порядке.
  Беспалитровый 2^32 Здесь 4 байта определяют 3 компоненты. Но, правда, один байт не используется. Его можно отдать, например, для альфа-канала (прозрачности). Читать растр в данном случае удобно структурами RGBQUAD, которая описана так:

 

RGBQUAD = record

rgbblue: byte;

rgbgreen: byte;

rgbred: byte;

rgbreserved: byte;

end;

 

Задания для самостоятельной работы

Написать программу, которая создаёт BMP-файл с заданным изображением.

Варианты изображений:

1) Тупоугольный треугольник;

2) Параллелограмм, не являющийся прямоугольником и ромбом;

3) Трапеция, у которой все высоты, проведенные к основаниям, попадают в точки, лежащие на продолжениях этих оснований;

4) Наконечник стрелы;

5) Снежинка;

6) Буква П;

7) Флаг РФ на жёлтом фоне;

8) Знак #;

9) Вопросительный знак;

10) Домик;

11) Мишень (несколько концентрических окружностей, цвета которых отличаются от цвета фона);

12) Прицел;

13) Т-образная фигурка тетриса (должны быть чётко видны составляющие её квадраты);

14) Любой математический пример.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-04-04 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: