Общая схема обработки заголовка файла. Возможные отклонения от стандарта.
Для построения на экране рисунка, хранящегося в ВМР-файле, надо выпол-нить следующие действия:
- ввести спецификацию и открыть файл для чтения;
- прочитать заголовок и выбрать из него данные о рисунке и файле;
- установить или преобразовать палитру используемых в рисунке цветов;
- записать образ рисунка в видеопамять.
Мы уже рассматривали такую последовательность действий при описании построения рисунков, хранящихся в файлах формата PCX. Она характерна для любого файла, в структуре которого можно выделить заголовок, палитру образ рисунка. От конкретных особенностей формата зависят лишь способы работы с отдельными частями файла.
Возможные отклонения от стандарта
По-видимому, стандарты пишут для того, чтобы их не соблюдали. Анализ большого количества файлов формата BMP приводит именно к такому печальному выводу. Потенциальные возможности для отклонений заложены в самом стандарте для Windows, который явно избыточен – многие величины можно просто вычислить исходя из значений других величин, а не выбирать их из полей заголовка. Именно так и поступают в большинстве случаев.
Наиболее пунктуально заполняют заголовок программы оцифровки изображений, например, выполняющие сканирование рисунков. Однако после оцифровки "оригинальные" файлы проходят достаточно сложный путь, связанный с различными преобразованиями. Очень часто рисунки редактируются с помощью графических редакторов, которые могут изменить заголовок файла по "своему усмотрению".
Например редактор Paintbrush для Windows просто очищает в заголовке байты с 30-го по 50-й, что при этом теряется – можно увидеть в табл. АЛ. Если такой файл импортировать в CorelDraw 4.0, то рисунок окажется искаженным, но сам Paintbrush воспроизводит его нормально. Вероятно, разработчики CorelDraw не учли возможность несоответствия заголовка файла стандарту BMP.
"Оригинал" мог быть подготовлен в одном графическом стандарте, а затем преобразован в другой, например, в стандарт BMP какой-либо программой. Такое преобразование может оказаться причиной более тонких ошибок, связанных с различием способов хранения самого рисунка. Например, по требованию стандарта PCX количество точек в строке должно быть кратно 16. Такое требование не противоречит стандарту BMP явно, но и не оговорено в нем. Если при преобразовании в BMP сохранить указанную особенность формата PCX, что обычно и делается, то рисунок будет искажен.
Стандарт для OS/2 оставляет меньше возможностей для отклонений, но одна все таки есть, – в двойном слове bfsize должен храниться размер файла. Содержимое этого слова лучше не использовать в программе. Слишком часто встречаются файлы с "потерянной" старшей частью двойного слова.
Как учесть в программе максимум возможных отклонений от стандарта? Для этого надо использовать только те величины, которые указаны в Табл. А.2. (кроме bfsize) и без которых воспроизвести рисунок просто невозможно, а все остальные вычислять. Способы вычислений описаны ниже.