Форум: "Media";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];
ВнизФормат файла TIF Найти похожие ветки
← →
BRemB (2004-11-17 11:41) [0]Добрый день, народ! Подскажите плз, как мне прочитать высоту и ширину картинки в формате TIF. Вообщем по структуре файла TIF вот что я нашел:
Заголовок файла (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-файл.
Байты 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.
Поле 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.
Сам тег, содержащий данные о ширине и высоте:
ImageLength
Tag = 257 (101h)
Type = SHORT или LONG
Length = 1
Длина (высота) изображения в пикселах (Y: вертикаль). Число строк
(иногда их называют как строки развертки) в изображении.
ImageWidth
Tag = 256 (100h)
Type = SHORT or LONG
Length = 1
Ширина изображения в пикселах (X: горизонталь). Число колонок в
изображении).
Вот код, кот пытается прочитать:
InfoTags:=TFileStream.Create(PathToFile,fmOpenRead);
//Считываем смещение на начало IFD (Image File Directory), где располагаются теги
//Считываем 4-7 байты со смещением 0 от начала файла
InfoTags.Seek($4,soFromBeginning);
InfoTags.Read(Buffer,4);
//Затем переходим по считанному смещению, на начало IFD
//Смещение всегда указывается относительно начало файла
InfoTags.Seek(Buffer,soFromBeginning);
//Считываем число тегов в этой директории (IFD), т.е. первые 2 байта
InfoTags.Read(Buffer,2); CountTags:=Buffer;
//В цикле ищем тег, отвечающий за ширину и высоту картинки
//Tag=257 - высота изображения; Tag=256 - ширина изображения
while CountTags>0 do
begin
InfoTags.Read(Buffer,1);
if (Buffer=257) or (Buffer=256) then
begin
WhatIsIt:=Buffer;
InfoTags.Seek(7,soFromCurrent);
InfoTags.Read(Buffer,4);
if WhatIsIt=257 then Height:=Buffer else Width:=Buffer;
break;
end;
InfoTags.Seek($B,soFromCurrent);
dec(CountTags);
end;
Но у меня не читается, что неправильно подскажите плз!!!
← →
Submarine (2004-11-17 12:23) [1]Лекция очень поучительна, но слишком длинная. Самый простой выход - установи компоненты ImageEn, и с помощью них можешь спокойно читать всю информацию.....
← →
BRemB (2004-11-17 13:22) [2]Нет, а если так как я предлогаю, где у меня ошибка, просто спортивный интерес проснулся
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2005.03.06;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.043 c