Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
54
Добавлен:
02.05.2014
Размер:
210.43 Кб
Скачать

19

Работа с графическими файлами

Чтение графических данных

Программа чтения файла в графическом формате должна обеспечивать его открытие и чтение, определение достоверности и интерпретацию содержащейся в нем информации. Программа чтения может получать исходные данные изображения либо из файла, либо от устройства ввода (в виде потока данных), такого как сканер или буфер изображений (в видеопамяти).

Наиболее распространенными являются программы чтения двух типов: фильтр и сканер. Фильтр читает исходные данные посимвольно, собирая их по мере поступления от устройства ввода или из файла. Сканер (также называемый анализатором) обеспечивает произвольный доступ ко всем исходным данным. В отличие от фильтров, которые не позволяют вернуться назад или перескочить вперед при чтении данных, сканеры могут читать любую информацию с какого угодно места файла. Основное различие между фильтрами и сканерами заключается в объеме используемой памяти. Хотя фильтры ограничены в способе чтения данных, они требуют для своей работы небольшого объема памяти. Зато сканеры, не имеющие подобных ограничений, могут потребовать для хранения информации больших объемов памяти или дискового пространства.

Программы чтения двоичных данных и данных в формате ascii

Программы чтения двоичных изображений должны читать двоичные данные, записанные в 1-, 2- и 4-байтовых словах по одной из существующих схем порядка байтов. Растровые данные можно читать большими порциями и буферизировать их в памяти для ускорения обработки (вместо того, чтобы читать их попиксельно или построчно).

Программы чтения изображений в формате ASCII требуют оптимизации функций чтения и анализа строки, позволяющих быстро найти и выделить требуемую информацию из строки символов, чтобы затем преобразовать ее в числовые величины.

Чтение заголовка графического файла

Программы чтения графических файлов значительно различаются в зависимости от способов хранения данных. Например, файлы PCX содержат только двоичные данные, "оканчивающиеся младшим"; файлы Encapsulated PostScript включают и двоичные, и ASCII-данные; двоичные данные файлов TIFF могут быть записаны и в порядке байтов "оканчивается старшим", и в порядке "оканчивается младшим"; файлы AutoCAD DXF состоят только из данных в формате ASCII.

Многие графические файлы, содержащие данные только в формате ASCII, могут быть проанализированы посимвольно. В этом случае для чтения файла и идентификации ключевых слов и значений обычно применяются тщательно продуманные циклы и вложенные операторы выбора (анализатора символьной информации).

При чтении большинства растровых файлов вы обнаружите, что первой порцией записанных здесь данных является заголовок. В заголовках содержится информация об атрибутах графических данных, например о высоте и ширине изображения, количестве имеющихся в нем цветов. Если в данном формате всегда сохраняются изображения одинакового размера и типа, с постоянным набором цветов, то заголовок может и не потребоваться. В таком случае информация, необходимая для обработки такого формата, должна быть просто "зашита" в программу чтения.

Однако большинство форматов растровых файлов имеют заголовки, и ваша программа должна знать внутреннюю структуру заголовков всех форматов, которые ей предстоит читать. В программе, предназначенной для чтения одного растрового формата, можно опустить определение известных смешений и читать только некоторые поля данных. Однако при работе с более сложными форматами, содержащими много полей информации, необходимо читать весь заголовок.

Если вы пишете на языке С, то можете прочесть заголовок файла с помощью следующего кода:

typedef struct _Header

{

DWORD FileId;

byte Type;

WORD Height;

WORD Width;

WORD Depth;

CHAR FileName[81] ;

DWORD Flags;

BYTE Filler[32];

} HEADER;

HEADER header;

FILE *fp = fopen ("MYFORMAT.FOR", "rb");

if (fp)

fread (&header, sizeof (HEADER), 1, fp);

Приведен пример типичного заголовка растрового файла, определенный в виде структуры на языке С. Поля этого заголовка содержат информацию о размере, цветах, типе изображения, флагах и имени файла изображения. Размер поля заголовка колеблется в пределах от 1 до 81 байта, а общая длина всей структуры составляет 128 байтов.

Первая потенциальная неприятность подстерегает вас еще до того, как вы начнете читать файл. Она затаилась в функции fopen(). Если вы не укажете, что открываете графический файл для чтения как двоичный (задав в списке аргументов функции fopen() вторым аргументом "rb"), то можете обнаружить в прочитанных данных лишние символы возврата каретки и/или перевода строки, которых не было в графическом файле. Это происходит из-за того, что по умолчанию функция fopen() открывает файлы в текстовом режиме.

В языке C++ нужно добавить дизъюнкцию ios::binary к аргументу режима конструктора fstream или ifstream:

fstream *fs = new fstream ("MYFORMAT.FOR", ios::in | ios::binary);

После того, как графический файл будет открыт, следующим шагом можно считать чтение его заголовка. С этой целью мы используем функцию fread(), применяемую для чтения порций данных из файла. Одним вызовом функции fread() мы сможем прочитать весь заголовок.

Основной проблемой, с которой вы можете столкнуться при чтении данных в структуру, является выравнивание элементов структуры (по границе машинного слова). В большинстве машин более эффективным является выравни­вание каждого элемента структуры по 2-, 4~, 8- или 16-битовым границам. Поскольку данная операция выполняется компилятором, а не программистом, то ее результаты не всегда очевидны.

Компилятор выравнивает элементы структуры по границам слова определенным образом: путем добавления заполнителей длина заголовка наращивается до 128 байтов. Но поскольку заполнители добавлены в конец заголовка, компиляторы могут добавить в структуру невидимые заполнители для того, чтобы:

• начать структуру с границы слова (с четного адреса памяти);

• выровнять каждый элемент по границам слова или двойного слова;

• обеспечить кратность размера всей структуры двум (16-битовые машины) или четырем (32-битовые машины).

Заполнители можно рассматривать как невидимые элементы, вставленные в структуру между элементами видимыми, определенными программистом. Хотя невидимые заполнители прямо не доступны, они, подобно любому видимому элементу, являются частью структуры.

Соседние файлы в папке Лекции по компьютерной графике