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