Формат TIFF

1. Структура
------------

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

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

Теперь мы опишем эти структуры более подробно.


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

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

Байты 0-1: Первое слово файла определяет порядок байтов,
используемый в файле. Допустимыми его значениями являются:

II (hex 4949)
MM (hex 4D4D)

В формате II в 16-битных и 32-битных целых числах порядок
байтов всегда идет от младших (менее значимых) к старшим (более
значащим). В формате MM для тех же чисел порядок байтов идет от
старших к младшим. В обоих форматах символьные строки запоминаются
как последовательность байтов в их естественном порядке.

Все программы, читающие TIFF-файлы, должны поддерживать оба
порядка байтов (см. Приложение G).

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

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


- 12 -

старые программы обычно не способны к работе с файлами,
содержащими новый номер версии. Мы хотели, чтобы поля TIFF имели
постоянное и хорошо определенное значение так, чтобы "старые"
программы как правило могли читать "новые" TIFF-файлы. Последнее
снижает стоимость разработки программного обеспечения и делает его
более надежным.

Байты 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) поля (здесь, возможно, более
удачным термином является Count - Счетчик).
Байты 8-11 содержат Смещение для значения (Value Offset), т.е.
байтовое смещение того места в файле, где расположено само
значение. Предполагается, что это смещение должно быть выровнено
на границу слова, т.е. Value Offset должно быть четным числом.
Это смещение может указывать на любое место в файле.

Элементы в IFD должны быть отсортированы в порядке возрастания
поля Tag. Заметим, что этот порядок отличен от того, в котором
поля описаны в данном документе. Упорядоченный по номерам список
тегов приведен в Приложении E. Значения, на которые указывают
элементы директории, могут следовать в файле в любом порядке.

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


- 13 -

Поле 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
и подобного ему. В Приложении G приведены рекомендации по этому
поводу.

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

Если вы еще не сделали этого, вы можете обратиться к Приложению G,
чтобы изучить примеры TIFF-изображений.


- 14 -


2. Определения
--------------

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

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



- 15 -

3. Поля
-------

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

Документация для каждого поля содержит имя поля (достаточно
произвольное, но согласованное), значение для поля Tag value, тип
поля (Type), ожидаемое число значений (N), комментарий,
описывающий поле и значения по умолчанию, если таковые существуют.
Если поле отсутвует, программы чтения TIFF должны принимать эти
значения по умолчанию.

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

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

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


Базовые поля

Базовыми полями являются поля, которые являются фундаментальными
для пиксельной архитектуры и визуальных характеристик изображения.

BitsPerSample
Tag = 258 (102h)
Type = SHORT
Length = SamplesPerPixel

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


- 16 -

каждой компоненты, соответствующей пикселу. Например, цветные
RGB-данные могут использовать различное число бит для компонент
каждой из трех цветовых плоскостей. Большинство RGB-файлов имеют
одинаковое число BitsPerSample для каждой компоненты. Даже в этом
случае следует включать все три элемента. Запись только 8 вместо
8,8,8 создает ошибочную ситуацию для других полей.

По умолчанию = 1. См. также SamplesPerPixel.
------------------------------------------------------------------

ColorMap
Tag = 320 (140h)
Type = SHORT
Length = 3 * (2**BitsPerSample)

Этот тег определяет цветовую RGB таблицу для изображений с
цветовой палитрой. Значения пикселов цветовой палитры
используются как индексы в трех таблицах цветопередачи (для
каждого из трех основных цветов). Например, если пиксел цветовой
палитры имеет значение, равное 0, то он должен высвечиваться в
соответствии в 0 элементом красной (Red), зеленой (Green) и синей
(Blue) таблиц цветопередачи.

Таблицы цветопередачи запоминаются последовательно. Сначала идут
элементы красного, затем зеленого и затем синего цветов. Длина
каждой таблицы равна 2**BitsPerSample (Для таких изображений
SamplePerPixel всегда равно 1). Следовательно, элемент ColorMap
для изображения с 8-битными палитровыми цветами должен составлять
3*256 элементов. Ширина каждого элемента равна 16 бит, поскольку
используется тип SHORT. 0 отвечает минимуму интенсивности и 65535
- максимуму. Черному цвету соответствует 0,0,0, и белому - 65535,
65535, 65535. Цель цветовой таблицы состоит в том, чтобы создать
таблицу поиска RGB-триплексов для пикселов, имеющих значения от 0
до 2**BitsPerSample-1.

Поле ColorResponseCurves может использоваться совместно с полем
ColorMap для более полного определения RGB-триплексов в ColorMap.
Однако, в большинстве случаев достаточно значения
ColorResponseCurves по умолчанию.

См. также PhotometricInterpretation.

Нет умолчаний. Поле ColorMap должно включаться для всех цветных
палитровых изображений.
------------------------------------------------------------------

ColorResponseCurves
Tag = 301 (12Dh)
Type = SHORT
Length = 3 * (2**BitsPerSample)

Этот тег определяет три таблицы цветопередачи, одну для красной,
одну для зеленой и одну для синей компонент цвета. Таблицы
цветопередачи запоминаются последовательно. Сначала идут элементы


- 17 -

красного, затем зеленого и затем синего цветов. Длина каждой
таблицы равна 2**BitsPerSample, причем используется значение
BitsPerSample, соответствующее каждой компоненте. Ширина каждого
элемента равна 16 бит, поскольку используется тип SHORT. 0
отвечает минимуму интенсивности и 65535 - максимуму. Черному цвету
соответствует 0,0,0, и белому - 65535, 65535, 65535.
Следовательно, элемент ColorResponseCurve для RGB-данных, где
каждая компонента содержит 8 битов, занимает 3*256 элементов,
причем каждый элемент имеет тип SHORT.

Цель этих таблиц цветопередачи состоит в определении содержимого
цветных RGB-изображений.

Для более подробной информации см. Приложение H, раздел VII.

Умолчание: таблицы базируются на рекомендованном NTSC значении
гамма=2.2. (См. Приложение H)
------------------------------------------------------------------

Compression
Tag = 259 (103h)
Type = SHORT
Length = 1

Значение тега определяет схему сжатия растровых данных. В
настоящее время для этого тега определены значения 1, 2, 5 и
32773.

Compression=1
Нет сжатия, но данные пакуются в байты настолько плотно,
насколько это возможно, так, чтобы не было неиспользуемых
битов (за исключением конца строк). Байты запоминаются как
массив типа BYTE, для BitsPerSample <= 8, SHORT, если
BitsPerSample > 8 и <= 16, и LONG, если BitsPerSample > 16 и
<= 32. Порядок байтов в данных, содержащих более 8 бит
должен соответствовать тому, который был указан в заголовке
TIFF-файла (байты 0 и 1). В формате II младшие байты
предшествуют старшим, в формате MM наоборот.

Если число бит в компоненте не является степенью 2, и вы
готовы пожертвовать некоторым пространством для достижения
более высокого быстродействия, вы можете использовать
ближайшее значение, являющееся степенью 2. Например, если
ваши данные описываются 6 битами, вы, возможно, захотите
указать, что они содержат 8 бит.

Строки должны начинаться с выравниванием на байт.
Следовательно, число байт на строку должно равняться
(ImageWidth*SamplesPerPixel*BitsPerSample + 7)/8, имея в виду
целую арифметику, для PlanarConfiguration=1. Для
PlanarConfiguration=2 это число равно (ImageWidth *
BitsPerSample + 7)/8.


- 18 -


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

Compression=2
Схема сжатия CCITT Group 3. Одно размерное кодирование
длинных серий по модифицированной схеме Хаффмана. См.
Приложение B: Сжатие данных - Схема 2. Значение
BitsPerSample должно быть равно 1, поскольку этот тип сжатия
определен только для двухуровневых изображений.

Когда вы декодируете данные, которые были сжаты с
Compression=2, вы должны транслировать белые серии в
последовательность нулей, и черные - в последовательность
единиц. Следовательно, стандартным значением
PhotometricInterpretation для этого сжатия является 0
(WhiteIsZero). Если программа чтения встретит значение
PhotometricInterpretation, равное 1 (BlackIsZero) для такого
изображения, оно должно быть высвечено или напечатано с
инвертированием черного и белого цветов.

Compression=5
LZW-сжатие для серых и цветных изображений. См. Приложение F.

Compression=32773
PackBits компрессия, простая схема сжатия с помощью длинных
серий, ориентированная на 1-битовые изображения. См.
Приложение С.

Сжатие данных оказывает влияние только на растровые данные, на
которые имеется указатель в StripOffsets. Вся другая
TIFF-информация остается неизменной.

По умолчанию = 1.
------------------------------------------------------------------


GrayResponseCurve
Tag = 291 (123h)
Type = SHORT
Length = 2**BitsPerSample

Цель этого тега, а также тега GrayUnits состоит в том, чтобы
обеспечить более точную фотометрическую интерпретацию серых
изображений в терминах оптической плотности.

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


- 19 -

GrayScaleResponseUnits равен 4 (десятитысячные доли), и значение
GrayScaleResponseCurve для серого уровня 4 равно 3455, то
получаемое действительное значение равно 0.3455. Оптические
измерители плотности обычно выдают значения в диапазоне от 0.0
до 2.0.

Если известна кривая передачи оптической плотности для данных в
TIFF-файле, и известна аналогичная кривая для выходного
устройства, то может быть выполнено осмысленное обращение между
входными данными и выходным устройством. Например, вывод может
точно соответствовать исходным данным. Кроме того, если исходное
изображение недостаточно контрастно (это нужно увидеть из его
таблицы отображения плотности), то может быть быть выполнено
априорное улучшение контрастности.

Цель данного тега состоит в создании таблицы поиска, которая
содержит 2**BitsPerSample-1 значений оптической плотности. Нулевой
элемент массива GrayResponseCurve используется для определения
плотности для всех пикселов, имеющих значение 0, первый элемент
массива GrayResponseCurve - для определения пикселов со значением
1, и т.д. до 2**BitsPerSample-1.

Если ваши данные на самом деле являются, скажем, 7-битными, но вы
добавили один бит к каждому пикселу, чтобы превратить их в
8-битные, все будет по-прежнему работать. Если ваши данные
выровнены по старшим разрядам, то половина элементов
GrayResponseCurve (возможно, только нечетные) никогда не будут
использоваться, но вам и не надо о них заботиться. Если данные
выровнены по младшим разрядам, значения пикселов будут находиться
в диапазоне от 0 до 127, и вам нужно соответствующим образом
составить таблицу GrayResponseCurve. Что эта таблица содержит в
диапазоне от 128 до 255 не имеет значения. Отметим, что
выравнивание по младшим разрядам, возможно, не лучшая идея,
поскольку не все приложения работают так, как GrayResponseCurve.
Заметим также, что LZW-сжатие дает одинаковую степень сжатия вне
зависимости от того проводилось выравнивание по младшим или по
старшим разрядам.

Наличие GrayResponseCurve допустимо даже для двухуровневых
(1-битных) изображений. В этом случае GrayResponseCurve будет
иметь два значения. Следует однако заметить, что программы чтения
TIFF-файлов класса B не обращают внимания на наличие
GrayResponseCurves в таких файлах. См. Приложение G.

Если в IFD существуют одновременно поля GrayResponseCurve и
PhotometricInterpretation, то значение GrayResponseCurve замещает
значение, определенное в PhotometricInterpretation. Однако,
наличие и того и другого поля является неплохой идеей, поскольку
некоторые прикладные программы не обращают внимания на
GrayResponseCurve.

Авторы программ для записи TIFF-файлов могут купить Kodak
Reflection Density Guide (номер каталога 146 5947), который стоит
$10 или переписать данные из него. Это поможет формировать


- 20 -

правильные кривые для передачи оптической плотности их сканера или
другого устройства. Если это покажется вам слишком большой
работой, мы рекомендуем кривую, которая линейна в пространстве
интенсивность-отражательная способность. Для вычисления
отражательной способности от плотности: R = 1/pow(10,D). Для
вычисления плотности в зависимости от отражательной способности: D
= log10(1/R). Типичная GrayResponseCurve для 4-битных изображений
будет выглядеть, следовательно, как: 2000, 1177, 875, 699, 574,
477, 398, 331, 273, 222, 176, 135, 97, 62, 30, 0, при
GrayResponseUnit=3. Такая кривая согласуется с
PhotometricInterpretation=1.

См. также GrayResponseUnit, PhotometricInterpretation, ColorMap.
------------------------------------------------------------------

GrayResponseUnit
Tag = 290 (122h)
Type = SHORT
Length = 1

Значение тега позволяет определить в каких единицах оптическая
плотность в теге GrayResponseCurve. Возможные значения
GrayResponse Unit:
1 = Число представляет десятые доли единицы.
2 = Число представляет сотые доли единицы.
3 = Число представляет тысячные доли единицы.
4 = Число представляет десятитысячные доли единицы.
5 = Число представляет стотысячные доли единицы.

Влияет на GrayResponseCurve.

См. также GrayResponseCurve.

По историческим причинам значение по умолчанию равно 2. Однако,
для большей точности мы рекомендуем использовать 3.
------------------------------------------------------------------


ImageLength
Tag = 257 (101h)
Type = SHORT или LONG
Length = 1

Длина (высота) изображения в пикселах (Y: вертикаль). Число строк
(иногда их называют как строки развертки) в изображении. См. также
ImageWidth.

Нет умолчаний.
------------------------------------------------------------------


- 21 -



ImageWidth
Tag = 256 (100h)
Type = SHORT or LONG
Length = 1

Ширина изображения в пикселах (X: горизонталь). Число колонок в
изображении). См. также ImageLength.

Нет умолчаний.
-------------------------------------------------------------------

NewSubfileType
Tag = 254 (FEh)
Type = LONG
Length = 1

Замещает старое поле SubfileType, снимая ограничения, определенные
в этом поле.
Общее описание данных, содержащихся в этом суб-файле. Это поле
образовано 32 битами-флагами. Предполагается, что неиспользуемые
биты должны быть равны 0. Бит 0 является младшим.

В настоящее время определены следующие значения:

Бит 0 равен 1, если изображение является версией с пониженным
разрешением другого изображения, имеющегося в этом же
TIFF-файле. В противном случае бит равен 0.
Бит 1 равен 1, если изображение является отдельной страницей
многостраничного изображения (см. описание тега PageNumber).
В противном случае бит равен 0.
Бит 2 равен 1, если изображение определяет маску прозрачности для
другого изображения в этом же TIFF-файле. Значение тега
PhotometricInterpretation должно равняться 4 (это значение
соответствует маске прозрачности).

Эти значения определены как битовые флаги, поскольку они в
достаточной степени независимы один от другого. Например, полезно
иметь 4 разных изображения в одном TIFF-файле: изображение с
полным разрешением, изображение с пониженным разрешением, маску
прозрачности для изображения с полным разрешением и маску
прозрачности для изображения с пониженным разрешением. Каждое из
этих четырех изображений будет иметь различное значение поля
NewSubfileType.

Значение по умолчанию равно 0.
------------------------------------------------------------------



- 22 -


PhotometricInterpretation
Tag = 262 (106h)
Type = SHORT
Length = 1

Тег определяет фотометрическую интерпретацию изображения и может
принимать значения 0, 1, 2, 3 и 4.

PhotometricInterpretation=0
Для двухуровневых и серых изображений: 0 означает, что пиксел
белый, 2**BitsPerSample-1 что он черный. Если существует тег
GrayResponseCurve, он переопределяет значение тега
PhotometricInterpretation, хотя безопаснее согласовать их
значения, поскольку старые прикладные программы могут
по-прежнему игнорировать GrayResponseCurve. Это обычное
значение для Compression=2.

PhotometricInterpretation=1
Для двухуровневых и серых изображений: 0 означает, что пиксел
черный, 2**BitsPerSample-1 что он белый. Если существует тег
GrayResponseCurve, он переопределяет значение тега
PhotometricInterpretation, хотя безопаснее согласовать их
значения, поскольку старые прикладные программы могут
по-прежнему игнорировать GrayResponseCurve. Если это
значение указано для Compression=2, то при высвечивании или
печати изображение должно быть инвертировано.

PhotometricInterpretation=2
RGB. В RGB модели цвет описывается как комбинация трех
основных цветов света (красного, зеленого и синего) в
соответствующих концентрациях. Для каждой из трех компонент
0 представляет минимум интенсивности и 2**BitsPerSample-1 -
максимум. Так, в RGB значение (0,0,0) представляет черный, а
значение (255,255,255) белый цвет при 8-битных компонентах.
При PlanarConfiguration=1 компоненты запоминаются в указанном
порядке: сначала красный, затем зеленый, затем синий. При
PlanarConfiguration=2 StripOffsets для плоскости каждой
компоненты запоминаются в следующем порядке: сначала
StripOffsets для красной плоскости, затем StripOffsets для
зеленой плоскости, затем StripOffsets для синей плоскости.

Поле ColorResponseCurves может использоваться для глобального
уточнения или изменения цветового баланса в RGB-изображениях
без изменения значений самих пикселов.

PhotometricInterpretation=3
Цветное изображение с палитрой. В этом режиме цвет
описывается одной компонентой. Эта компонента используется
как индекс в таблицах цветопередачи тега ColorMap для
красной, зеленой и синей компонент, чтобы определить триаду
RGB, которая задает действительное значение цвета. Если
используется тег PhotometricInterpretation, то он должен


- 23 -

применяться и к таблицам цветопередачи. Значение
SamplesPerPixel должно равняться 1.

PhotometricInterpretation=4
Маска прозрачности. Это означает что последующее изображение
используется для определения нерегулярной области другого
изображения, расположенного в этом же TIFF-файле. Теги
SamplesPerPixel и BitsPerSample должны иметь значение 1.
Рекомендуется использование схемы сжатия PackBits. Единичный
бит определяет внутреннюю часть области, а нулевой - внешнюю.
Маска прозрачности должна иметь те же значения тегов
ImageLength и ImageWidth, что и основное изображение.

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

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

Нет умолчаний. Это означает, что если вас волнует, чтобы ваше
изображение не было высвечено или напечатано как инвертированное,
вы должны записать это поле. Не полагайтесь, что прикладная
программа поступит с вашим изображением по умолчанию так, как вам
нужно! Для черно-белых и серых изображений рекомендуется значение
PhotometricInterpretation = 1 (за исключением Compression=2),
чем достигается популярный пользовательский интерфейс для
изменения яркости и контрастности изображений.
PlanarConfiguration
Tag = 284 (11Ch)
Type = SHORT
Length = 1

Тег определяет последовательность запоминания компонент пикселов в
цветных изображениях и может принимать значения 1 и 2.

PlanarConfiguration=1
Значения компонент пикселов запоминаются последовательно так,
что они располагаются в одной плоскости изображения. См. тег
PhotometricInterpretation для определения порядка компонент
внутри пиксельных данных. Следовательно, для RGB-данных
данные запоминаются как RGBRGBRGB... и т.д.

PlanarConfiguration=2
Компоненты запоминаются в отдельных компонентных плоскостях.
Значения тегов StripOffsets и StripByteCounts образуются как
двумерные массивы с SamplesPerPixel строк и StripsPerImage
колонок (сначала запоминаются все колонки для строки 0, затем
все колонки для строки 1, и т.д.). PhotometricInterpretation
описывает тип данных, который запомнен в каждой компонентной
плоскости. Например, RGB-данные запоминаются как красные


- 24 -

компоненты в одной плоскости, зеленые компоненты в другой и
синие - в третьей.

Если SamplesPerPixel равен 1, PlanarConfiguration не имеет
значения и не должен включаться.

По умолчанию равно 1. См. также BitsPerSample, SamplesPerPixel.
------------------------------------------------------------------


Predictor
Tag = 317 (13Dh)
Type = SHORT
Length = 1

Используется при Compression=5 (LZW). См. Приложение F.

1 = Нет схемы предварительных операций перед кодированием.

По умолчанию равно 1.
------------------------------------------------------------------


ResolutionUnit
Tag = 296 (128h)
Type = SHORT
Length = 1

Используется совместно с тегами XResolution и YResolution и
определяет единицы, в которых задаются значения этих тегов.

ResolutionUnit=1
Нет абсолютных единиц измерения. Используется для
изображений, которые могут иметь неквадратный
пространственный коэффициент пропорциональности по
горизонтали и вертикали (aspect ratio), но для которых не
важны абсолютные размеры. Недостаток ResolutionUnit=1
состоит в том, что разные прикладные программы могут
переводить изображение в разные размеры. Даже если решение
является достаточно произвольным, возможно лучше использовать
число точек на дюйм или на сантиметр, и задавать для
XResolution и YResolution такие значения, чтобы сохранялся
коэффициент пропорциональности (aspect ratio) и максимальный
размер изображения составлял, например, 4 дюйма.
ResolutionUnit=2
Дюймы.

ResolutionUnit=2
Сантиметры.

По умолчанию равно 2. См. также XResolution, YResolution.
------------------------------------------------------------------


- 25 -

RowsPerStrip
Tag = 278 (116h)
Type = SHORT или LONG
Length = 1

Число строк в полосе. Данные изображения организуются в полосы,
которые затем используются для быстрого доступа к нужной строке,
если данные подвергались сжатию (хотя использование этого поля
допустимо даже если данные не сжимались).

Теги RowsPerStrip и ImageLength сообщают вам число полос во всем
изображении. Уравнение

StripsPerImage = (ImageLength + RowsPerStrip - 1) / RowsPerStrip

подразумевает использование целой арифметики.

Заметим, что для значения тега могут использоваться типы данных
SHORT или LONG. Значение SHORT используется для небольших
TIFF-файлов. Однако, следует заметить, что предыдущие описания
TIFF-файлов требовали значения LONG и некоторые прикладные
программы могут не ожидать появления значения типа SHORT. Для
получения дополнительных рекомендаций см. Приложение G.

По умолчанию равно 2**32-1, что на практике означает
бесконечность, т.е. все изображение располагается в одной полосе.
Однако, мы не рекомендуем использовать одну полосу. Выбирайте
RowsPerStrip таким образом, чтобы каждая полоса занимала
приблизительно 8К байтов, даже если данные не сжимаются, поскольку
это упрощает буферизацию для программ чтения. Значение 8К является
достаточно произвольным, но представляется вполне работоспособным.

См. также ImageLength, StripOffsets, StripByteCounts.
------------------------------------------------------------------

SamplesPerPixel
Tag = 277 (115h)
Type = SHORT
Length = 1

Число компонент в пикселе. SamplesPerPixel равно 1 для
двухуровневых, серых и палитровых изображений и равно 3 для
RGB-изображений.

По умолчанию=1.

См. также BitsPerSample, PhotometricInterpretation.
------------------------------------------------------------------


- 26 -

StripByteCounts
Tag = 279 (117h)
Type = SHORT or LONG
Length = StripsPerImage для PlanarConfiguration=1.
= SamplesPerPixel*StripsPerImage для
PlanarConfiguration=2

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

Нет умолчаний. См. также StripOffsets, RowsPerStrip.
------------------------------------------------------------------


StripOffsets
Tag = 273 (111h)
Type = SHORT or LONG
Length = StripsPerImage для PlanarConfiguration=1.
= SamplesPerPixel*StripsPerImage для
PlanarConfiguration=2

Для каждой полосы ее байтовое смещение в файле. Смещение
указывается по отношению к началу TIFF-файла. Заметим, что наличие
этого поля делает положение текущей полосы независимым от
местоположения других полос. Эта возможность должна быть особенно
полезна для редактирующих программ. Это дает единственный способ
нахождения данных изображения для программ чтения и,
следовательно, должно существовать.

Заметим, что для значения тега могут использоваться типы данных
SHORT или LONG. Значение SHORT используется для небольших
TIFF-файлов. Однако, следует заметить, что предыдущие описания
TIFF-файлов требовали значения LONG и некоторые прикладные
программы могут не ожидать появления значения типа SHORT. Для
получения дополнительных рекомендаций см. Приложение G.

Нет умолчаний. См. также StripByteCounts, RowsPerStrip.

XResolution
Tag = 282 (11Ah)
Type = RATIONAL
Length = 1

Число пикселов на единицу, определенную полем ResolutionUnit в
направлении X, т.е. в направлении ImageWidth. Это, конечно не
гарантирует, что изображение действительно будет напечатано с
размерами, определяемыми этим параметром. Он предназначен для
прикладных программ, которые могут использовать его по своему
усмотрению.

Нет умолчаний. См. также YResolution, ResolutionUnit.
------------------------------------------------------------------


- 27 -

YResolution
Tag = 283 (11Bh)
Type = RATIONAL
Length = 1

Число пикселов на единицу, определенную полем ResolutionUnit в
направлении Y, т.е. в направленииImageLength.

Нет умолчаний. См. также XResolution, ResolutionUnit.
------------------------------------------------------------------

Информационные поля

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

Artist
Tag = 315 (13Bh)
Type = ASCII

Имя человека, создавшего изображение.

Если вам нужно добавить к изображению замечание типа Copyright, то
это то место, где это следует сделать. На практике вы возможно
захотите записать содержимое этого поля сразу после 8-байтового
TIFF-заголовка. Проверьте, что ваш IFD и указатели полей
выставлены надлежащим образом, и сделайте это.
DateTime
Tag = 306 (132h)
Type = ASCII
Length = 20

Дата и время создания изображения. Используйте формат YYYY:MM:DD
HH:MM:SS с 24 часовым диапазоном значений для часов и одним
пробелом между датой и временем. Длина строки вместе с нулевым
символом составляет 20 байтов.
------------------------------------------------------------------

HostComputer
Tag = 316 (13Ch)
Type = ASCII

Компьютер, на котором создано изображение. ENIAC или что-то еще.

См. также Make, Model, Software.
------------------------------------------------------------------


- 28 -

ImageDescription
Tag = 270 (10Eh)
Type = ASCII

Например, пользователь может по своему усмотрению добавить к
изображению комментарий типа "1988 Компания на пикнике".

Предполагается, что это то, что в газетах и журналах называется
"подписью под иллюстрацией".
------------------------------------------------------------------

Make
Tag = 271 (10Fh)
Type = ASCII

Тип сканера, видеодигитайзера и т.п.

См. также Model, Software.
------------------------------------------------------------------

Model
Tag = 272 (110h)
Type = ASCII

Название/номер модели сканера, видеодигитайзера и т.п.

Этот тег предназначен исключительно для информации пользователю.

См. также Make, Software.

Software
Tag = 305 (131h)
Type = ASCII

Название и версия программы, создавшей изображение.

Этот тег предназначен исключительно для информации пользователю.

См. также Make, Model.
------------------------------------------------------------------


- 29 -

Факсимильные поля

Факсимильные поля могут быть полезны для вас, если вы используете
TIFF для запоминания факсимильных сообщений в их исходном виде. Их
не рекомендуется использовать для обмена с прикладными программами
типа настольных издательств.

Compression (базовый тег)
Tag = 259 (103h)
Type = SHORT
Length = 1

Значение тега определяет схему сжатия растровых данных. В
настоящее время для этого тега определены значения 3 и 4.

Compression=3
Факсимильно-совместимая схема сжатия CCITT Group 3, в
точности соответствующая документу "Standardization of Group
3 facsimile apparatus for document transmission,
Recommendation T.4, Volume VII, Fascicle VII.3, Terminal
Equipment and Protocols for Telematic Services, The
International Telegraph and Telephone Consultative Committee
(CCITT), Geneva, 1985, pp. 16-31". Каждая полоса должна
начинаться с выравниванием на байт (напоминаем, что
изображение может состоять целиком из одной полосы). Строки,
которые не являются первыми в полосе не обязательно
начинаются с границы байта. Данные запоминаются как байты,
никакие перестановки байтов внутри слов не допускаются. Для
задания таких опций Group 3, как 1D и 2D используется поле
Group3Options.

Compression=4
Факсимильно-совместимая схема сжатия CCITT Group 4, в
точности соответствующая документу "Facsimile Coding Schemes
and Coding Control Functions for Group 4 Facsimile Apparatus,
Recommendation T.6, Volume VII, Fascicle VII.3, Terminal
Equipment and Protocols for Telematic Services, The
International Telegraph and Telephone Consultative Committee
(CCITT), Geneva, 1985, pp. 40-48". Каждая полоса должна
начинаться с выравниванием на байт. Строки, которые не
являются первыми в полосе не обязательно начинаются с границы
байта. Данные запоминаются как байты, но не как слова.
перестановки байтов внутри слов не допускаются. Опции для
Group 4 определены в поле Group4Options.
------------------------------------------------------------------

Group3Options
Tag = 292 (124h)
Type = LONG
Length = 1

См. Compression=3. Это поле образовано 32 битами-флагами.
Неиспользуемые биты должны быть нулевыми. Бит с номером 0 является


- 30 -

младшим. Наверное, не имеет смысла пытаться читать файл, если один
из этих битов имеет единичное значение, но вы не знаете, что он
означает.

Бит 0 равен 1 для двумерного кодирования (в противном случае
подразумевается одномерное). Если для двумерного кодирования
задано более одной полосы, каждая полоса должна начинаться с
одномерной схемы. Т.е. RowsPerStrip должен быть умножен на
"Parameter K", как это указано в документации CCITT.

Бит 1 равен 1, если используется режим без компрессии.

Бит 2 равен 1, если перед кодом EOL добавляются биты-заполнители,
чтобы EOL всегда заканчивался на границе байта. Это
обеспечивает, что EOL-последовательность всегда заканчивается
единичным байтом, которому предшествуют по крайней мере два
нулевых: xxxx-0000-0000-0001.

По умолчанию равен 0 для базового одномерного кодирования.

См. также Compression.
------------------------------------------------------------------

Group4Options
Tag = 293 (125h)
Type = LONG
Length = 1

См. Compression=4. Это поле образовано 32 битами-флагами.
Неиспользуемые биты должны быть нулевыми. Бит с номером 0 является
младшим. Наверное, не имеет смысла пытаться читать файл, если один
из этих битов имеет единичное значение, но вы не знаете, что он
означает. В настоящее время изучаются схемы кодирования для серых
и цветных изображений. Они будут добавлены, когда это изучение
закончится.

При двумерной схеме кодирования каждая полоса кодируется так, как
если бы она была отдельным изображением. В частности, каждая
полоса начинается с границы байта и кодирование для первой строки
полосы проводится независимо от предыдущих строк с использованием
горизонтальных кодов (т.е. так, как если бы предыдущая строка была
пустой). Каждая полоса заканчивается 24-битным блока конца
факсимильного сообщения (end-of-facsimile block - EOFB).
Бит 0 не используется.
Бит 1 равен 1, если используется режим без компрессии.

По умолчанию равно 0, для двумерной двоичной компрессии.

См. также Compression.
------------------------------------------------------------------


- 31 -

Поля запоминания и восстановления документов

Эти поля могут полезны для запоминания и восстановления
документов. Не рекомендуется их использование для обмена с
программами типа настольных издательств.

DocumentName
Tag = 269 (10Dh)
Type = ASCII

Имя документа, из которого было просканировано изображение.

Нет умолчаний.

См. также PageName.
------------------------------------------------------------------

PageName
Tag = 285 (11Dh)
Type = ASCII

Название страницы, с которой было просканировано изображение.

См. также DocumentName.

Нет умолчаний.
------------------------------------------------------------------


PageNumber
Tag = 297 (129h)
Type = SHORT
Length = 2

Этот тег используется для указания номера страницы для
многостраничных (в том числе факсимильных) документов. Задаются
два значения типа SHORT. Первое значение является номером
страницы; второе - номером страницы в документе.

Отметим, что страницы не обязательно должны следовать в порядке их
номеров. Номер первой страницы равен 0.

Нет умолчаний.
------------------------------------------------------------------

XPosition
Tag = 286 (11Eh)
Type = RATIONAL

X-смещение левого края изображения относительно левого края
страницы, заданное в единицах, определяемых тегом ResolutionUnits.

Нет умолчаний. См. также YPosition.
------------------------------------------------------------------


- 32 -

YPosition
Tag = 287 (11Fh)
Type = RATIONAL

Y-смещение верхнего края изображения относительно верхнего края
страницы, заданное в единицах, определяемых тегом ResolutionUnits.
В координатной схеме TIFF положительным направлением для Y
считается направление вниз, поэтому YPosition всегда положительно.

Нет умолчаний. См. также XPosition.
------------------------------------------------------------------


Поля, не рекомендуемые для дальнейшего использования


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

CellLength
Tag = 265 (109h)
Type = SHORT
Length = 1

Длина в одно битных компонентах матрицы для полутонирования или
дифферинга. Считается, что Threshholding = 2.

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

Нет умолчаний. См. также Threshholding.
------------------------------------------------------------------


- 33 -

CellWidth
Tag = 264 (108h)
Type = SHORT
Length = 1

Ширина в одно битных компонентах матрицы полутонирования/
дифферинга.

Нет умолчаний.

См. также Threshholding и комментарий для тега CellLength.
------------------------------------------------------------------


FillOrder
Tag = 266 (10Ah)
Type = SHORT
Length = 1

Порядок значений данных внутри байта (1 или 2).

FillOrder=1
Старшие биты располагаются в байтах первыми. Т.е. значения
данных (или кодовых слов) упорядочены от битов старших
порядков к битам младших порядков внутри байта.

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

По умолчанию FillOrder = 1.
------------------------------------------------------------------


FreeByteCounts
Tag = 289 (121h)
Type = LONG

Для каждого свободного блока в файле число байтов в этом блоке.
Программы чтения TIFF-файлов могут игнорировать теги FreeOffsets и
FreeByteCounts, если таковые присутствуют.

Теги FreeOffsets и FreeByteCounts не переопределяют логическое
адресное пространство внутри файла.


- 34 -

Поскольку эта информация может быть извлечена путем просмотра
директорий и тегов StripOffsets и StripByteCounts, то в тегах
FreeByteCounts и FreeOffsets нет необходимости. Кроме того,
неясно, что делать, если эти теги присутствуют в нескольких
директориях.

См. также FreeOffsets.
------------------------------------------------------------------


FreeOffsets
Tag = 288 (120h)
Type = LONG

Для каждого свободного блока файла его байтовое смещение.

См. также FreeByteCounts.
------------------------------------------------------------------


MaxSampleValue
Tag = 281 (119h)
Type = SHORT
Length = SamplesPerPixel

Максимальное используемое значение компоненты пикселов. Например,
если изображение состоит из 6-битовых данных, выровненных в
младших битах 8-битовых байтов, то значение MaxSampleValue не
может быть больше 63. Это поле никак не влияет на визуальные
характеристики изображения и не оказывает влияния на интерпретацию
других полей. Используется только для статистических целей.

По умолчанию равно 2**(BitsPerSample) - 1.
------------------------------------------------------------------

MinSampleValue
Tag = 280 (118h)
Type = SHORT
Length = SamplesPerPixel

Минимальное используемое значение компонент пикселов. Это поле
никак не влияет на визуальные характеристики изображения. См.
комментарий к тегу MaxSampleValue.

По умолчанию равно 0.
------------------------------------------------------------------

SubfileType
Tag = 255 (FFh)
Type = SHORT
Length = 1

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


- 35 -

SubfileType=1
Изображение с полным разрешением. Поля ImageWidth,
ImageLength и StripOffsets являются обязательными.

SubfileType=2
Изображение с уменьшенным разрешением. Поля ImageWidth,
ImageLength и StripOffsets обязательны. Далее предполагается,
что это изображение является версией другого изображения,
находящегося в этом же файле, но с уменьшенным разрешением.

SubfileType=3
Отдельная страница многостраничного изображения (см.
описание тега PageNumber).

Отметим, что в одном TIFF-файле может находиться несколько
изображений, причем каждое из них описывается собственной IFD.

Нет умолчаний.

Дальнейшее использование этого поля не рекомендуется. Программы
записи должны использовать вместо него более общее поле
NewSubfileType.
------------------------------------------------------------------


Orientation
Tag = 274 (112h)
Type = SHORT
Length = 1

Значение тега определяет ориентацию изображения на экране.
Возможны следующие значения:

Orientation=1
При высвечивании нулевая строка соответствует верхнему краю
изображения и нулевая колонка - левой его стороне.

Orientation=2
При высвечивании нулевая строка соответствует верхнему краю
изображения и нулевая колонка - правой его стороне.

Orientation=3
При высвечивании нулевая строка соответствует нижнему краю
изображения и нулевая колонка - правой его стороне.

Orientation=4
При высвечивании нулевая строка соответствует нижнему краю
изображения и нулевая колонка - левой его стороне.

Orientation=5
При высвечивании нулевая строка соответствует левой стороне
изображения и нулевая колонка - верхнему его краю.


- 36 -

Orientation=6
При высвечивании нулевая строка соответствует правой стороне
изображения и нулевая колонка - верхнему его краю.

Orientation=7
При высвечивании нулевая строка соответствует правой стороне
изображения и нулевая колонка - нижнему его краю.

Orientation=8
При высвечивании нулевая строка соответствует левой стороне
изображения и нулевая колонка - нижнему его краю.

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


Threshholding
Tag = 263 (107h)
Type = SHORT
Length = 1

Значение тега определяет тип двухуровнего изображения. Возможны
следующие значения:

Threshholding=1
Двухуровневое изображение со сплошными линиями.
BitsPerSample должен быть равен 1.

Threshholding=2
Изображение, полученное с помощью дифферинга из изображения с
непрерывными тонами (типа фотографии). BitsPerSample должен
быть равен 1.

Threshholding=3
То же, что 2, но получено путем рассеивания ошибки (Error
Diffused).

По умолчанию Threshholding=1. См. также CellWidth, CellLength.