Programming on C++

Rambler's Top100

Как я писал реализацию чтения BMP

 

Главная страница

Статьи

Программы

Ссылки

Форум

Формат BMP состоит из нескольких частей: заголовок, палитра, сам рисунок. Я сам читал максимум 256-цветные картинки (использовал драйвер svga256.bgi, но там только 256 цветов).

Структура первого заголовка:

char[2] type два байта 'BM' указывающие, что это BMP
long SizeFile размер файла в байтах
int Reserved1 не используется
int Reserved2 не используется
long OffsetImage смещение картинки в байтах

Всего 14 байт. Далее идёт второй заголовок:

long size размер второго заголовка (всегда 40)
long width ширина картинки
long height высота картинки
int BitPlanes число битовых плоскостей (всегда 1)
int BitCount число битов на пиксель
long TypeComp тип сжатия (обычно 0)
long SizeImage Размер картинки в байтах
long XPerMetr горизонтальное разрешение пиксель/метр
long YPerMetr вертикальное разрешение пиксель/метр
long ColorUsed число используемых цветов
long ColorImportant число "важных" цветов

Всего 40 байт. BitCount может принимать значения:

1 - картинка монохромная, в палитре всего 2 цвета и картинка кодируется следующим образом: каждый бит в массиве кодирует цвет (0 - 1 цвет, 1 - 2-ой)

4 - картинка имеет максимум 16 цветов. Цвет пиксела определяет четырёхбитный блок.

8 - картинка имеет максимум 256 цветов. Каждый байт определяет цвет.

24 - картинка имеет 2^24 цветов (16777216) палитра отсутствует и цвет определяется пакетом из трёх байтов - красный, зелёный, синий.

Если TypeComp не ноль, то картинка сжата и надо будет использовать алгоритм RLE, это я расскажу в следующей статье.

Далее идёт палитра (если BitCount не 24):

char red интенсивность красного
char green интенсивность зелёного
char blue интенсивность синего
char reserved не используется

Далее идёт картинка:

Рисуется снизу вверх, слева направо. Т.е. начало координат - нижний угол экрана. А рисовать сначала надо слева направо первую строчку, потом вторую и т.д. ...

Раскодируется так:

BitCount == 1

рассматривается бит bit:

нарисовать цветом (bit+1)

BitCount == 4

рассматривается четвёрка битов bites:

нарисовать цветом (bites+1)

BitCount == 8

рассматривается байт byte:

нарисовать цветом (byte+1)

BitCount == 24

рассматривается тройка байтов red, green, blue:

нарисовать цветом [red,green,blue]

под квадратными скобками я подразумеваю нарисовать цвет (интенсивность красного, интенсивность зелёного, интенсивность синего).

При всех BitCount, кроме 24, надо писать setrgbpalette() при чтении палитры. При BitCount == 24 надо писать setrgbpalette() при чтении картинки.

Я написал исходник только для 256 цветов. Вы можете изменить его и для 24б.

Исходник

Назад, на рубрику Статьи.

 

 

 

Rambler's Top100 Рейтинг@Mail.ru

 

Copyright ©2002 Safronov Pavel

Hosted by uCoz