4.4 Формат TIFF

Растровый формат TIFF (Tagged Image File Format) был создан для преодоления трудностей, которые возникают при переносе графических файлов с IBM-совместимых ПЭВМ на ПЭВМ Macintosh и обратно.

Спецификация TIFF была выпущена Aldus Corporation в 1986 году и представила данный формат в качестве стандартного метода хранения черно-белых изображений, созданных сканерами и программными пакетами верстки.

Широкое распространение получила разработанная в апреле 1987 года модификация формата 4.0, которая могла поддерживать обработку несжатых цветных RGB-изображений. TIFF модификации 5.0 (появившийся в августе 1988 года) позволял хранить цветные изображения с палитрой и поддерживать алгоритм сжатия LZW. Выпущенный в июне 1992 года TIFF 6.0 расширил свои функциональные возможности поддержкой цветных изображений моделей  СМYK и YCbCr, а также использовал метод сжатия JPEG.

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

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

Организация файла. Файлы TIFF состоят из трех разделов: заголовка файла изображения (Image File Header - IFH), директории файла изображений (Image File Directory - IFD) и растровых данных (Тэг). Из них необходимыми являются только IFH и IFD. Следовательно, допускается возможность существования файла TIFF, не содержащего растровых данных. Файл TIFF, содержащий несколько изображений будет включать столько же директорий файла и разделов растровых данных (по одному для каждого изображения). Структура формата представлена на рис.9.

 

 

 

 

 

 

 

Рис. 9 Обобщенная структура TIFF - файла

В составе структуры TIFF - файла можно выделить:

1. Заголовок, включающий:

- идентификатор порядка байтов в файле (от  старших к младшим или наоборот);

- номер версии;

- указатель на первую директорию IFD;

2.  Директория (IFD) - содержит описание одного изображения:

- счетчик тэгов в директории;

- последовательность тэгов;

- указатель на следующую директорию IFD;

3. Тэг:

- идентификатор поля;

- тип поля (базовое, информационное, факсимильное и поле запоминания и восстановления документов);

- длина поля;

- смещение в файле к данным.

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

TIFF является сложным форматом, поскольку местоположение каждой директории и ее данных (включая растровые данные) может изменяться. Единственной составной частью файла TIFF, которая имеет постоянное место, является заголовок – он всегда располагается в первых 8 байтах каждого файла TIFF. Все остальные данные файла создаются с использованием информации IFD. Директория файла изображения и связанный с ней растр составляют субфайл TIFF. Ограничений на количество субфайлов в файле TIFF не существует.

Каждая директория файла содержит одну или несколько структур данных, называемых тегами. Каждый тег является 12-байтовой записью, содержащей определенную информацию о растровых данных. Тег может хранить данные любого типа, и спецификация TIFF определяет свыше 70 тегов, которые применятся для представления заданной информации. Теги каждой директории объединяются в непрерывные группы.

Теги, определенные спецификацией TIFF, называются общедоступными и не могут изменяться в большей мере, чем это предусмотрено спецификацией. Теги, определенные пользователем, называются частными и предназначены для применения в пользовательских программах через Developer’s Desk фирмы Aldus.

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

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

 
Рис.10 Возможные варианты структуры данных файла TIFF

Каждая директория файла изображения связывает все растровые данные файла TIFF. Данные директории можно прочесть либо непосредственно из структуры IFD, либо найдя их по смещению, записанному в IFD. С помощью смещения в файле TIFF можно задать одно из трех перечисленных ниже местоположений. Смещение, указанное в последних четырех байтах заголовка, определяет позицию первой директории. Последние четыре байта каждой директории содержат информацию о смещении следующей директории, а последние четыре байта каждого тега — либо информацию о смещении данных, либо сами данные. Величина смещения всегда определяется количеством байтов от начала файла TIFF. Возможные способы объединения структур данных в файле TIFF отображены на рис. 11.

 

Рис. 11 Объединение структур данных в файле TIFF

Файл TIFF может содержать любое количество изображений (включая нулевое). Каждое изображение рассматривается как отдельный растровый субфайл, данные которого описываются информацией IFD. Каждый субфайл TIFF может быть записан в виде отдельного файла или вместе с другими субфайлами объединен в один файл TIFF. Каждый растровый субфайл имеет свою директорию файла изображения и может располагаться в любом месте (после заголовка). Каждому изображению может соответствовать только одна директория.

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

Формат директории файла изображений соответствует следующей структуре:

Typedef struct _TifIfd

{

  WORD   NumDirEntries;  /* Количество тегов в IFD */

  WORD   TagList[];            /* Массив тегов */

  DWORD NextIFDOffset;  /* Смещение следующей IFD */

} TIFIFD

Поле NumDirEntries является 2-байтовой величиной, задающей количество тегов в IFD. После этого поля следует серия тегов, причем их количество соответствует значению поля NumDirEntries. Каждая теговая структура имеет размер 12 байтов и может быть представлена в виде элемента массива структур типа TIFTAG. Количество тегов в одной IFD не должно превышать 65535. Поле NextIFDOffset содержит информацию о смещении начала следующей директории. Если других IFD нет, то значение этого поля равно 00h.

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

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

Тег формата TIFF имеет следующую структуру:

Typedef struct _TifTag

{

  WORD   Tagid;         /* Идентификатор тега */

  WORD   Datatype;   /* Скалярный тип элементов данных */

 DWORD DataCount; /* Количество элементов данных тега */

 DWORD DataOffset; /* Смещение элементов данных */

} TIFTAG;

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

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

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

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

Для определения полосы растровых данных в файле TIFF  используются три тега: RowsPerStrip, StripOffsets и StripByteCounts.

Тег RowsPerStrip задает количество строк сжатых растровых данных в каждой полосе. Значение по умолчанию тега RowsPerStrip, равное 232-1, указывает максимально возможный размер изображения TIFF. Для всех полос в субфайлах TIFF применяется однотипная схема сжатия, Все они имеют одинаковые битовый и цветовой пол, пиксельную глубину и т.п. Чтобы определить количество полос в субфайле изображения, отличного от YCbCr, используются теги RowsPerStrip и ImageLenght.

Тег StripOffsets содержит массив смещений (по одному на полосу), которые указывают позицию первого байта каждой полосы в файле TIFF. Первый элемент массива указывает смещение первой полосы, второй — смещение второй полосы и т.д. Если данные изображения разделены на плоскости (PIanarConfiguration == 2), то тег StripOffsets располагает двухмерным массивом значений — таблицей шириной SampIesPerPixeI. В таком случае сначала записываются все колонки компонента цвета (плоскости) со значением 0, затем все колонки компонента цвета (плоскости) со значением 1 и т.д. Полосы данных изображения, организованные в виде плоскостей, могут записываться в файл TIFF в любом порядке, но обычно записываются либо по плоскостям (RRRRGGGGBBBB), либо по компонентам цвета (RGBRGBRGBRGB). Значения тега StripOffsets всегда рассматриваются как показатели смещения от начала файла.

Тег StripByteCounts описывает массив значений, указывающих размер каждой полосы в байтах. Подобно тегу StripOffsets он содержит одномерный (в случае порций) или двухмерный (в случае плоскостей) массив значений — по одному на полосу. Каждое из этих значений характеризует количество байтов сжатых растровых данных, записанных в соответствующей полосе.

Целесообразность этого тега объясняется следующим. В некоторых случаях полосы изображения занимают в файле различное количество байтов, например из-за сжатия растровых данных изображения. Значение тега StripByteCounts определяет размер полосы изображения после сжатия данных изображения. Хотя несжатые строки изображения, как правило, занимают постоянное количество байтов, размер сжатой строки зависит от типа содержащихся в ней данных. Поскольку мы обычно записываем в полосу фиксированное количество строк (а не байтов), то, очевидно, что большинство полос будут различаться по длине - ведь каждая сжатая строка имеет свой размер. Если же растровые данные не сжимались, то все полосы будут одинаковыми по размеру.

Программы записи TIFF обычно пытаются создавать полосы таким образом, чтобы каждая из них включала в себя одинаковое количество строк. Например, растр из 2200 строк может быть разделен на 22 полосы, каждая из которых будет содержать 100 строк растровых данных. Но такое деление не всегда возможно. Положим, растр состоит из 482 строк. Если его разделить на полосы, содержащие по пять строк, то получим 97 полос, причем 96 из них будут состоять из пяти строк данных, а 97-я - только из двух. В этом случае значение пятого тега RowsPerStrip будет корректным для всех полос, кроме последней. Программе чтения TIFF не обязательно знать количество строк в каждой полосе. Достаточно прочесть последнее значение тега StripByteCounts, чтобы определить количество байтов, которое следует прочесть для формирования последней полосы.

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

Во-вторых, создав таблицу смешений полос, можно значительно упростить произвольный доступ к растровым данным. Если необходимо отобразить, например, последние 100 строк изображения, состоящего из 480 строк, а растровые данные разделены на 48 полос по десять строк в каждой, то программа чтения TIFF может пропустить первые 380 строк и обработать только те полосы, смещения которых записаны в последних десяти элементах массива тега StripOffsets. Если смещение не указано, то для определения начальной позиции последних 100 строк необходимо читать все изображение с его начала.

Фрагменты. Полосы не являются единственно возможным способом организации растровых данных. В TIFF 6.0 представлена концепция разделения растровых данных на фрагменты. Полоса — это одномерный объект, имеющий только длину, а фрагмент можно рассматривать как двухмерные блоки (полосы), имеющие длину и ширину (подобно растру). Фактически каждый фрагмент изображения можно рассматривать как сегмент растра. Таким образом, изображение представляется в виде совокупности сегментов, называемых в спецификациях TIFF фрагментами, с учетом их местоположения в оригинале изображения.

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

Как известно некоторые программы EDIP не могут манипулировать изображениями размером более Е (6848 пикселей в ширину на 8800 пикселей в длину), поскольку для буферирования, распаковки и манипулирования даже несколькими сотнями строк данных изображения требуется слишком большой объем памяти компьютера. Если необходимо отобразить только верхний левый угол изображения, придется распаковывать всю полосу растра, разместив ее в памяти. Если же данные этого изображения будут разделены на фрагменты, то потребуется распаковать только тот фрагмент, который содержит данные для указанной части изображения.

Многие алгоритмы сжатия, и в частности JPEG, для сжатия данных используют двухмерные фрагменты - блоки, а не одномерные полос. Хранение сжатых данных в виде фрагментов способствует ускорению дешифровки данных. Концепции разделения данных изображения на фрагменты (сегменты) включены в спецификацию TIFF 6.0.

Если вместо полос применяются фрагменты, то три тега, описывающие полосы (RowsPerStrip, StripByteCounts и StripOffsets), заменяются тегами TileWidth, TileLenght, TileOffsets и TileByteCounts. Их предназначение и способ применения фактически те же, что и у тегов, описывающих полосы. Подобно полосам все фрагменты могут быть либо несжатыми, либо сжатыми по одной схеме. Изображения TIFF могут быть разделены либо только на полосы, либо только на фрагменты.

Теги TileWidth и TileLenght описывают размер фрагментов данных изображения. Их значения должны быть кратными 16, а все фрагменты субфайла должны иметь один размер. Это очень важно для некоторых программ особенно в случае применения ориентированной на фрагменты схемы сжатия JPEG. Спецификация TIFF 6.0 рекомендует, чтобы фрагменты были прямоугольной форма и  содержали (до сжатия) от 4 до 32 Кб данных изображения.

Значения тегов TileWidth и TileLenght могут применяться для определения количества фрагментов субфайлов изображений, отличных от YCbCr:

TilesAcross = (ImageWidth + (TileWidth - 1)) / TileWidth;

TilesDown = (ImageLength + (TileLength - 1)) / TileLength;

Tileslnlmage = TilesAcross * TilesDown;

Если изображение разделено на плоскости (PIanarConnguration = 2), то количество фрагментов можно вычислить следующим образом:

Tileslnlmage == TilesAcross * TilesDown * SamplesPerPixel;

Тег TileOnffets содержит массив смещений первых байтов каждого фрагмента. Фрагменты записываются в субфайл в произвольном порядке. Каждый фрагмент имеет собственное смещение и не зависит от других фрагментов в субфайле. Смещения в этом теге указываются в направлении слева направо и сверху вниз. Если данные изображения разделены на плоскости, то вначале записываются все смещения для первой плоскости, затем все смещения для второй и т.д. Количество смещений в этом теге равно количеству фрагментов изображения (PIanarConnguration = 1) или количеству фрагментов, умноженному на значение тега SamplesPerPixel (PIanarConnguration = 2). Смещения всегда указываются от начала файла TIFF.

Последний тег — TileByteCounts — содержит данные о количестве байтов в каждом сжатом фрагменте. Количество значений этого тега также равно количеству фрагментов изображения, причем эти значения упорядочены тем же способом, что и значения тега TileOffsets.

Обычно размер фрагмента выбирается таким, чтобы точно разделить изображение. Изображение шириной 6400 пикселей и длиной 4800 пикселей можно точно разделить на 150 фрагментов шириной 640 пикселей и длиной 320 пикселей. Однако не все изображения имеют размеры, кратные 16. Изображение шириной 2200 пикселей и длиной 2850 пикселей нельзя точно разделить на фрагменты, размеры которых будут кратными 16. В этом случае решением может стать выбор рациональных размеров фрагмента и дополнение изображения.

Под рациональными понимаются такие размеры фрагмента, при которых размер изображения будет перекрываться минимально. При указанном выше размере изображения можно применить разбиение на фрагменты шириной 256 пикселей и длиной 320 пикселей, т.е. сохранить почти то же соотношение ширины и высоты, что и у исходного изображения. Разбиение на фрагменты таких размеров потребует применения по 104 дополнительных пикселя набивки в каждой строке и 30 дополнительных строк. Размер данных изображения с учетом набивки теперь составит 2304 пикселя в ширину и 2880 пикселей в длину, что позволит точно разделить это изображение на 81 фрагмент размером 256 х 320 пикселей.

В последнем примере общий объем набивки, добавленной к изображению перед разделением его на фрагменты, равен 365520 пикселям. В случае 1-битовых изображений это составит лишних 45690 байтов данных изображения. Значит, при разбиении на фрагменты небольших изображений ощутимых результатов от их сжатия ожидать не приходится. Кроме того, необходимо избегать разбиения на фрагменты слишком больших размеров, поскольку это потребует еще более значительных объемов набивки.

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

В спецификации TIFF 5.0 перечисленные основные типы изображений были названы классами. Каждый файл TIFF строится из общего класса (Class X) и может модифицироваться дополнительным классом, зависящим от типа хранимого изображения: Class В (двухуровневое), Class G (полутоновое), Class P (палитровое) и Class R (полноцветное RGB).

В спецификации TIFF 6.0 эти классы переопределены в четыре отдельные конфигурации базовых файлов. Класс Х объединен с каждым из остальных четырех классов для формирования конфигураций двухуровневых, полутоновых, цветных с палитрой и полноцветных файлов. И хотя спецификация TIFF 6.0 практически не предусматривает использование классов, считается весьма вероятным, что еще продолжительное время TIFF-файлы будут определяться согласно этим обозначениям классов, поскольку файлов в формате TIFF 5.0 существует значительно больше, чем любых других.

Фактически существует еще один класс TIFF — Class F, предназначенный для хранения факсимильных изображений в данном формате. Этот класс файлов (также известен под именем Everex Fax File Format) был создан фирмой Cygnet Technologies. И, несмотря на то, что данная фирма перестала существовать, формат TIFF Class F продолжает применяться.

TIFF поддерживает два способа хранения цветовых данных. TIFF-P подобен GIF и использует цветовую палитру (карту) для изображения. Тогда сами данные об изображении хранятся как коды в соответствии с цветовой картой. Этот метод обеспечивает эффективность хранения, но ограничивает палитру 256 цветами. Цветовая карта создает свои элементы из 48-битовой палитры (основная структурная единица TIFF - 2-байтовое слово, следовательно, по 16 цветов предоставлено каждой из цветовых плоскостей аддитивной цветовой модели RGB: красной, зеленой и синей). TIFF-R используется для определения полных RGB-изображений. Элемент растра представляется тремя  8-битовыми RGB-значениями, что обеспечивает более 16 миллионов цветов.

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

Сжатие. TIFF считается хорошо сжимающим форматом. Он поддерживает несколько схем сжатия, специальные функции управления изображением и многие другие возможности. Кроме того, он позволяет применять схему сжатия, заключающуюся в добавлении необходимых тегов, определяемых пользовате­лем. Формат TIFF 4.0 поддерживал лишь групповое кодирование (RLE) и CCITT (T.4 и Т.6). Обычно эти схемы применяются только для сжатия 8-битовых цветных и полутоновых, а также 1-битовых черно-белых изображений соответственно. В TIFF 5.0 была добавлена схема сжатия LZW, обычно используемая при работе с цветными изображениями, а в TIFF 6.0 — метод JPEG, применяемый для сжатия многоградационных цветных и полутоновых изображений. В TIFF применяется также схема сжатия PackBits RLE, используемая инструментальными средствами Macintosh.

Еще одной особенностью TIFF является спецификация разрешающей способности оборудования, например, IBM PC, Macintosh и т.д.

Формат TIFF характеризуется большими объемами получаемых файлов (например, изображение формата A4 в цветовой модели CMYK с разрешением 300 dpi, обычно применяемым для высококачественной печати, имеет объем порядка 40 Мбайт). Поэтому он используется преимущественно при вводе информации со сканеров и в электронных версиях печатных изданий.

Hosted by uCoz