site4.gif (42260 bytes)Современные форматы графических файлов

Вечера с Вовой

А.Г. Леонов

Продолжение. Начало в № 17/99

l l l

— Представь, что ты нарисовал треугольник. Для сохранения рисунка в BMP-файле тебе потребуются 1,4 Мб, а если рисовать треугольник векторами, указывая координаты начала и конца каждого отрезка (координаты двухбайтовые)? Какой объем файла потребуется для сохранения такого треугольника?

— 16 байт. — Ответ прозвучал через несколько секунд.

— Но мы будем рассматривать только растровую графику. Теперь еще вопрос. Как ты думаешь, если сохранить в файле только растр картинки, который еще называют растровым массивом, сумела бы программа Ulead Photo Express разобраться, что текст не является картинкой?

— Нет.

— Правильно! Для этого потребуется еще дополнительная информация в файле. Она называется заголовком графического файла. В нем указываются тип файла и некоторая дополнительная информация, например, размер файла. Давай заглянем внутрь BMP-файла. Для примера возьмем файл с фотографией кукол dolls.bmp размером 1407 Кб. Откроем его при помощи Ulead Photo Express. Посмотрим характеристики файла (properties):

Data type: RGB True color (24-bit)
Ширина: 800 Pixels
Высота: 600 Pixels
Размер: 1406 Кб
Имя: dolls.bmp
Формат: Windows bitmap
Compression: None

— Не обращай пока внимания на “страшное слово” — compression. Теперь при помощи специальной программы HEX-viewer “посмотрим” на внутренности файла:

000000 42 4D 36 F9 15 00 00 00 00 00 36 00 00 00 28 00
000010 00 00 20 03 00 00 58 02 00 00 01 00 18 00 00 00
000020 00 00 00 F9 15 00 25 16 00 00 25 16 00 00 00 00
000030 00 00 00 00 00 00 1D 35 55 1C 36 56 20 39 58 25
000040 3D 5C 28 3F 5F 28 3F 5F 26 3E 5A 24 3A 56 20 35
BM6·······6···(·
·····X·········
······%···%·····
·······5U·6V 9X%
=\(?_(?_&>Z$:V 5

Файл начинается с символов “BM”, указывающих на формат файла: Windows bitmap, далее закодирован размер файла: 4 байта — шестнадцатеричные числа: 00, 15, F9, 36. Закодированное число читается справа налево. Теперь возьми бумажку и вычисли размер файла, переведя числа из шестнадцатеричного в десятичное представление, а затем сравни с реальным размером файла.

— Ответ готов, — доложил Вова, проведя необходимые вычисления, — 1440054.

Задача 1.2. Проверьте: не ошибся ли Вова?

— А теперь посмотри, вот таблица, описывающая формат BMP:

Название Длина  (в байтах)     Содержимое файла dolls.bmp Примечание

Заголовок файла
Размер файла
Не используется
С какого байта начало растрового массива
Доп. информация
В том числе
Длина
Ширина изображения
Высота изображения
Спец. информация
Бит/пиксель
Метод сжатия
Длина растрового массива
Горизонтальное разрешение
Вертикальное разрешение
Число цветов
Число основных цветов
Таблица цветов
Растровый массив

14
4
4
4
(всего) 40

4
4
4
2
2
4
4
4
4
4
4
до 1024
переменная

42 4D (в том числе “BM” )
36 F9 15 00
00 00 00 00
36 00 00 00


28 00 00 00
20 03 00 00
58 02 00 00
01 00
18 00
00 00 00 00
00 F9 15 00
25 16 00 00
25 16 00 00
00 00 00 00
00 00 00 00
нет
1D 35 ...

Это код “BM”
=1440054




=40
=800
=600

=24 битам на точку

=1440054—54

нет палитры
нет палитры
может отсутствовать

      Я заполнил лишь первые две колонки: название и длина, а третью оставил Вове. После того как он закончил свою колонку, я дописал комментарии, а он перевел числа из шестнадцатеричной системы в десятичную. Большинство полей формата ему были понятны, однако некоторые требовали пояснения.

— А что такое разрешение? — спросил Вова.

— Когда ты сканируешь фотографию или делаешь снимок цифровым фотоаппаратом, происходит преобразование в дискретную, цифровую форму. Изображение получает определенный размер в пикселях (точках), и, чтобы при этом не потерялась информация о реальном исходном размере фотографии, требуется хранить разрешение, указывающее, сколько точек изображения помещалось в 1 см (или в 1 дюйме). Разрешение (как горизонтальное, так и вертикальное) вычисляется делением получившегося размера в пикселях на соответствующий размер. Если изображение имеет 800 точек по горизонтали, а длина исходной фотографии была 12 см, то при сканировании использовалось разрешение 800/12 = 67 точкам в 1 см. Чем выше разрешение, тем качественнее получится изображение при печати, но тем больше будет растровый массив и, соответственно, файл займет больше места.

— А если я просто нарисовал рисунок в Paint, какое там разрешение? — не унимался Вова.

— Разрешение имеет смысл только при печати. При рисовании картинки никакого разрешения может и не быть. Правда, какое-то разрешение присваивается по умолчанию, ведь предполагается, что нарисованная картинка потом будет напечатана. Понятно?

— Понятно.

— Теперь еще немного про формат BMP.

BMP — это сокращение от BitMaP (битовая карта), “родной” формат графических файлов для Windows, поскольку наиболее близко соответствует внутреннему формату системы, в котором последняя хранит свою графическую информацию. Файлы, представленные в BMP-формате, чаще всего имеют расширение BMP, хотя говорят, что допустимо и другое расширение имени файла — RLE (run length encoding — кодирование длины серий). Это расширение указывает на то, что произведено сжатие файла одним из способов сжатия RLE. При этом файл становится меньше, что экономит место на диске. Но об этом позже. В нашем примере информация о цвете точки была закодирована 24 битами...

— То есть точка могла “гореть” одним из 16,7 млн цветов? — спросил Вова.

— Да, но в целях экономии места иногда используют меньшее число бит для кодирования информации о точке.

— А! Знаю-знаю! — Вова захлопал в ладоши. — 1 бит для черно-белых изображений, какая экономия!

Задача 1.3. Подсчитайте, какая экономия при 1 бите на точку (растр по-прежнему 800ґ600), 4 битах на точку, 8 битах, 16 битах.

— В файлах BMP информация о цвете каждого пикселя кодируется 1, 4, 8, 16 или 24 битами на пиксель. Это число, называемое глубиной представления цвета, и определяет максимальное число цветов в изображении.

— Ага, изображение глубиной 1 бит может иметь всего два цвета: черный и белый, — добавил Вова.

— Но вернемся к формату. Формат собственно данных растрового массива в файле BMP зависит от числа бит, используемых для кодирования данных о цвете каждого пикселя. При 256-цветном изображении под каждый пиксель растрового массива отводится один байт (8 бит). Этот байт не содержит яркостей основных цветов красного, синего и зеленого (RGB)...

— Как было в режиме true color?

— Да, но в случае 256-цветного изображения байт пикселя содержит номер цвета в таблице цветов файла. Таким образом, если в качестве первого значения цвета RGB в таблице цветов файла BMP хранится
R/G/B=255/0/0, то значению пикселя 0 (в растровом массиве) будет поставлен в соответствие ярко-красный цвет.

Сама таблица цветов, называемая еще палитрой, представляет собой массив. Индекс элемента массива — это номер цвета палитры, а содержимое массива — тройки чисел, описывающие цвет яркостью трех основных компонент R/G/B (красного, зеленого, синего). Как ты видел, 24-битные изображения не имеют таблицы цветов.

Файлы BMP с глубиной 16 бит на пиксель также не имеют таблиц цветов, в них, как в 24-битных файлах, значения пикселей растрового массива непосредственно задают значения цветов RGB. Значения пикселей в растровом массиве хранятся слева направо, начиная (как правило) с нижней строки изображения. Таким образом, в 256-цветном BMP-файле первый байт данных и растрового массива представляет собой индекс для цвета пикселя, находящегося в нижнем левом углу изображения; второй байт представляет индекс для цвета соседнего справа пикселя и т.д. Если число байт в каждой строке нечетно, то к каждой строке добавляется еще байт, чтобы “выровнять” данные растрового массива до четного числа.

— Это все? — с надеждой спросил мой усталый собеседник. — Теперь я все знаю про BMP-формат?

— Могут быть некоторые вариации по хранению различных частей файла; так, растровый массив в некоторых 16- и 256-цветных BMP-файлах может быть сжат алгоритмом RLE. Но об этом в другой раз.

Вова вскочил, потянулся.

— Ну, я пошел, дядя Саша? Завтра зайду?

— Спокойной ночи, Вова. Жду тебя завтра. Будем чай пить и форматы обсуждать. Там еще масса интересного. Хватит не на один вечер.

Продолжение следует

TopList