Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
4-1106643434
vogel
2005-01-25 11:57
2005.03.06
Как сделать чтоб прога не отображалась в панели задач


3-1107194327
Руслана
2005-01-31 20:58
2005.03.06
Вопрос по SQL запросу


1-1108583165
pasha L
2005-02-16 22:46
2005.03.06
перечисление элементов массива


14-1108112967
yanval
2005-02-11 12:09
2005.03.06
Шиза в интернете (более модератору)


10-1085398909
Koster
2004-05-24 15:41
2005.03.06
Как использовать в Delphi тип, объявленный внутри OLE объекта?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский