Автор: Nemo
e-mail: capnemo@xakep.ru
Январь 2002 г.
Вторая статья из цикла (о как! :), посвященного форматам графических файлов. Кто не читал первую может прочитать ее сразу после прочтения этой. На этот раз речь пойдет о BMP. Полагаю, нет необходимости расшифровывать название и называть разработчиков этого формата... Так что перейдем сразу к делу. Мой адрес e-mail находиться все там же. (см. верхний правый угол).
Файл BMP может содержать изображения, размером 2**32х
2**32 пикселей и глубину цвета от 1 до 24 бит (патологически %).
Основные элементы файла:
- Заголовок
- Палитра (если нужна)
- Изображение
Заголовок (он же Head).
TBMHeader=record
Sign:integer; {Подпись}
Size:longint; {Длина файла}
Reserv1:integer; {-}
Reserv2:integer; {-}
Lock:longint; {Местонахождение растрового массива}
HeadLen:longint; {Длина заголовка}
Width:longint; {Ширина изображения}
Height:longint; {Высота изображения}
PlNum:integer; {Количество цветовых плоскостей}
BitPix:integer; {Бит/пиксель}
Compr:longint; {Метод сжатия}
MassLen:longint; {Длинна растрового массива}
HorRazr:longint; {Горизонтальное расширение}
VerRazr:longint; {Вертикальное расширение}
ColNum:longint; {Число цветов изображения}
MainColNum:longint; {Число основных цветов}
end;
Sign - подпись, говорящая о том, что это файл BMP. Поле всегда
имеет значение 'BM' = 424Dh. (Вернее было бы сказать, что
несовпадение этой подписи с 'BM' говорит о том, что это
не BMP-файл.)
Size - размер файла. Позволяет судить о целостности
данных файла. Если размер не совпадает со значением поля,
стоит задуматься.(Хотя это не помешает и в любом другом
случае :)
Reserv1,Reserv2 - Ну что тут говорить, резерв - он
резерв и есть. Поля имеют нулевое значение, однако, значения
программой чтения (!) не проверяются. (Надеюсь, понятно почему %)
Lock - Местонахождение растрового массива. Смещение данных
изображения относительно начала файла. Что тут еще можно сказать?
HeadLen - Длина заголовка в байтах. Многие авторы отделяют
все поля начиная с Sing и до Lock включительно от остальных
полей заголовка и называют первые пять полей "Заголовком файла",
а остальные - "Заголовком изображения". "Заголовком файла" - всегда
16 байт. В поле HeadLen указан размер "Заголовком изображения" и
в большинстве случаев содержит значение 28h (40). Попадались
мне файлы, с другими размерами заголовка. Но их количество очень
незначительно (2 файла :).
Width - Ширина изображения в пикселях. Как использовать,
я пока не решил, но говорят - очень важное поле :).
Height - Высота изображения в пикселях. Используется вместе с
шириной.
PlNum - Количество цветовых плоскостей изображения. Не встречались
мне файлы, у которых больше, чем одна плоскость (меньше чем одна
тоже не видал :).
BitPix - бит на пиксель. По этому полю я определял количество
цветов. При описании поля ColNum поговорим об этом подробней.
Compr - Мой знакомый говорил, что водились в компутерах такие
файлы BMP, у которых это поле отличалось от нуля. Но я таких
не видел. Поле это указывает тип сжатия информации. 0 - без
сжатия. 1 - RLE алгоритм. Не видел я нигде описания и алгоритма
сжатия по схеме RLE-BMP, а может просто не захотел искать...
MassLen - Длина растрового массива. Если не поняли, что это за
поле - начните расшифровку с конца. Найдите определение слова
"массив", затем "растр", а потом и "длина".
HorRazr,VerRazr - разрешение горизонтальное и
вертикальное.
Только вот разрешение чего? Меня этот вопрос сильно не интересовал.
Если вы собираетесь создавать изображения - запишите в оба поля
число 0EC4h (3780).
ColNum - количество цветов изображения.
Казалось бы, назначение
поля понятно интуитивно, но... в подавляющем
большинстве файлов
это поле имеет значение 0(нуль :). Для определения количества
цветов я использовал переменную BitPix.
MainColNum - количество "главных" цветов. Если вдруг программа
просмотра обнаружила, что она не может отобразить 256 цветов
(а изображение, предположим, содержит именно столько), ей следует
отображать максимальное количество "главных" цветов, информация
о которых содержится в первых элементах палитры.
Палитра расположена сразу за заголовком (если она есть :). Её наличие определяется количеством цветом в изображении. Если их больше 256 - палитра не хранится (пиксели представлены триплетами прямо в растровом массиве). На каждый цвет палитра отводит 4 байта (R,G,B,Rs) - Red,Green,Blue,Reserv. Reserv всегда имеет значение 0.
Нет ничего проще, чем прочитать файл BMP. Размер каждой строки растровой матрицы (изображения :) выровнен по 32-х битной границе. Для определения этого размера я использовал очевидную формулу - size= (4-(Width mod 4)) and 3; Теперь читаем блок размером size и рисуем строку на экране. Но (!) следует помнить, что: 1.изображение в файле BMP храниться начиная с нижней строки. 2. При 256 цветах 1 байт = 1 пиксель, при 16 - 1 байт=2 пикселя, при 2 - 1 байт = 8 пикселей. Внизу есть ссылка на программу, читающую 2-х,16-ти и 256-ти цветовые изображения BMP.
На этом и закончим нашу вторую беседу:). Пишите, читайте %) Nemo. F.E.G. P.S. Программа тут :Р
Написать мнение в гостевой книге.
:НАЗАД:
© 2001-2002 [F.E.G.]