Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Derevo_PZOZ_Lab / обр_изо_№5.doc
Скачиваний:
36
Добавлен:
23.03.2015
Размер:
111.62 Кб
Скачать

Лабораторная работа №5

Формат tiff

Цель работы: изучение структуры формата графических файлов TIFF.

1. Структура

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

TIFF-файл начинается с 8-байтового заголовка файла (Image File Header), который указывает на одну или несколько директорий файла (Image File Directories). Директории содержат информацию о изображениях и указатели на данные самого изображения.

Рассмотрим эти структуры более подробно.

* Header * * Image File Directory *

----T--------------------------------¬---------------T----------------------¬

¦ 0 ¦ Byte order: ¦¦ X ¦ Number of entries A ¦

¦ ¦ LL - Least to Most significant ¦+--------------+----------------------+

¦ ¦ MM - Most to Least significant ¦¦ X+2 ¦ Entry 0 ¦

+---+--------------------------------++--------------+----------------------+

¦ 2 ¦ Version number - 42 ¦¦ X+14 ¦ Entry 1 ¦

+---+--------------------------------++--------------+----------------------+

¦ 4 ¦ Offset of the first IFD ¦¦ ... ¦ Entry I ¦

¦ ¦ ( X value ) ¦+--------------+------------------------+

L---+---------------------------------¦ X+2+(A-1)*12 ¦ Entry A-1 ¦

Adresses are in byte X,Y and Z +--------------+----------------------+

are variables containing offset; ¦ X+2+A*12 ¦Offset to the next IFD¦

A is a variable. L--------------+----------------------

* Directory entry * ------T-----------------------------------------¬

------T-------¬ ¦ Y ¦ Tag ¦

¦ Z = Value ¦ +-----+---------------------------------------+

L-----+-------- ¦ Y+2 ¦ Data type ¦

+-----+---------------------------------------+

¦ Y+4 ¦Length of data ( in the terms of type )¦

+-----+---------------------------------------+

¦ Y+8 ¦ Offset to value Z ¦

L-----+----------------------------------------

Заголовок файла (Image File Header - IFD)

TIFF-файл начинается с 8-байтового заголовка, содержащего следующую информацию:

Байты 0-1: Первое слово файла определяет порядок байтов, используемый в файле. Допустимыми его значениями являются: II (hex 4949) и MM (hex 4D4D). В формате II в 16-битных и 32-битных целых числах порядок байтов всегда идет от младших (менее значимых) к старшим (более значимым). В формате MM для тех же чисел порядок байтов идет от старших к младшим. В обоих форматах символьные строки запоминаются как последовательность байтов в их естественном порядке. Все программы, читающие TIFF-файлы, должны поддерживать оба порядка байтов.

Байты 2-3: Второе слово TIFF-файла - это номер версии. Это число, равное 42 (2A hex), но оно не равно номеру редакции текущей спецификации TIFF (в данном случае номер редакции текущей спецификации - это 5.0). Фактически номер версии TIFF (42) никогда не меняется и, возможно, никогда не изменится. Но если это случится, то будет означать, что TIFF изменился настолько радикально, что программа чтения TIFF должна немедленно прекратить работу. Число 42 было выбрано из-за его глубокого философского смысла. Оно должно использоваться для дополнительной проверки того, что это действительно TIFF-файл. TIFF-файлы не имеют явного номера редакции (т.е. 5.0 для текущей редакции). Это решение при разработке было принято сознательно. Во многих форматах поля могут принимать различные значения в зависимости от номера версии. Проблема состоит в том, что как только формат начинает "стареть", возрастают трудности по документированию того, какие поля, что означают в данной версии, и старые программы обычно не способны к работе с файлами, содержащими новый номер версии.

Байты 4-7: Это слово типа long, содержащее смещение (в байтах) первой директории файла (Image File Directory). Директория может располагаться в любом месте файла вслед за заголовком, но ее начало должно быть выровнено на границу слова. В частности, директория может следовать за данными изображения, которое она описывает. Программы чтения должны просто перемещаться по этому указателю, вне зависимости от того, куда он указывает. Термин байтовое смещение (byte offset) используется для ссылки на положение относительно начала файла. Первый байт файла имеет смещение, равное 0.

Директории файла (Image File Directory)

Директории файла (Image File Directory - IFD) состоят из 2-байтового счетчика числа элементов (т.е. числа тегов в данной директории), вслед за которым расположена последовательность 12-байтовых тегов и далее 4-байтовое смещение для следующей директории (или 0, если она отсутствует). Не забывайте записывать 4 нулевых байта в конце последней директории!

Каждый 12-байтный элемент IFD имеет следующий формат:

Байты 0-1 содержат Тег (Tag) поля.

Байты 2-3 содержат Тип (Type) поля.

Байты 4-7 содержат Длину (Length) поля .

Байты 8-11 содержат Смещение для значения (Value Offset), т.е. байтовое смещение того места в файле, где расположено само значение. Это смещение должно быть выровнено на границу слова, т.е. Value Offset должно быть четным числом. Это смещение может указывать на любое место в файле. Элементы в IFD должны быть отсортированы в порядке возрастания поля Tag. Значения, на которые указывают элементы директории, могут следовать в файле в любом порядке.

Для экономии времени и пространства поле Value Offset интерпретируется как само значение, а не как указатель на значение, если значение умещается в 4 байтах. Если значение меньше 4 байтов, то оно выравнивается по левому краю 4-байтового поля, т.е. запоминается в байтах с младшими номерами. Для того, чтобы определить умещается или нет значение в 4 байтах, следует проверить значения полей Type и Length.

Поле Length описывает данные в терминах типов данных, а не общим числом байтов в поле. Например, одиночное 16-битное слово (SHORT) имеет Length равное 1, а не 2. Ниже приведены типы данных и их длины:

1 = BYTE 8-битое беззнаковое целое.

2 = ASCII 8-битные байты, которые содержат ASCII-коды;

последний байт должен быть нулевым.

3 = SHORT 16-битное (2-байтовое) беззнаковое целое.

4 = LONG 32-битное (4-байтовое) беззнаковое целое.

5 = RATIONAL два числа типа LONG: первое представляет

числитель дроби, второе - ее знаменатель.

Значение поля Length для данных типа ASCII включает нулевой байт. Если необходимо выравнивание (например, на границу слова) то поле Length не включает байты, добавляемые при выравнивании. Отметим, что здесь не нужен байт-счетчик как в паскалевских строках. Наличие поля Length делает его ненужным. Строго говоря, нулевой байт в конце строк не является необходимым, но его присутствие значительно упрощает жизнь для программистов, пишущих на C.

Программы чтения должны проверять тип данных. В настоящее время TIFF допускает использование нескольких типов данных для одного и того же поля. Например, поля ImageWidth (ширина изображения) и ImageLength (длина изображения) описаны, как имеющие тип SHORT. На некоторых устройствах возможны большие изображения, имеющие более 64K строк или колонок. Вместо добавления параллельного LONG-тега для этих полей, проще допустить возможность использования типов и SHORT и LONG для поля ImageWidth и подобного ему.

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

Соседние файлы в папке Derevo_PZOZ_Lab