2015-11-04 3 views
1

Я пытаюсь прочитать пользовательский тег в файле tiff.Как читать пользовательские теги TIFF (без TIFFFieldInfo)

Есть несколько инструкций по этой теме, но AFAIK они используют интерфейс (struct) под названием TIFFFieldInfo. Я уже читал documentation, и снова появился TIFFFieldInfo. Я мог бы пойти с ним, но они (the library) говорят, что интерфейс OBSOLETED. Не могли бы вы предложить мне разумные альтернативы? Или я просто неправильно прочитал заголовочный файл?

+1

Если вы не можете найти любую UpToDate библиотеку, писать TIFF информации читателя с нуля не так уж трудно; документы довольно просты. (Я сделал один год назад, я посмотрю, смогу ли я найти источник, но, вероятно, сейчас он устарел). –

ответ

1

Наконец-то я нашел решение. Руководство (TIFFGetField(3tiff)) говорит все, что нам нужно. См. Сеанс AUTOREGTERTERED TAGS. Следующее - скопированное.

AUTOREGISTERED TAGS Если вы не можете найти тег в таблице выше, что означает, что это неподдерживаемый тег и не непосредственно поддерживается LibTIFF библиотекой (3TIFF). Вы все равно сможете прочитать значение , если вы знаете тип данных этого тега. Например, если вы хотите прочитать LONG значение из тега 33424 и ASCII строки из в 36867 тегов вы можете использовать следующий код:

uint32 count; 
void *data; 

TIFFGetField(tiff, 33424, &count, &data); 
printf("Tag %d: %d, count %d0", 33424, *(uint32 *)data, count); 
TIFFGetField(tiff, 36867, &count, &data); 
printf("Tag %d: %s, count %d0", 36867, (char *)data, count); 

Например, мне нужно прочитать тег в два раза, так что я использовал следующий код (но я не проверял):

tiff *tif = TIFFOpen("ex_file.tif", "rc"); // read tif 
static ttag_t const TIFFTAG_SOMETAG = 34362; // some custom tag 
if(tif != nullptr) // if the file is open 
{ 
    uint count; // get count 
    double *data; // get data 
    if(TIFFGetField(tif, TIFFTAG_SOMETAG, &count, &data) == 1) // read tag 
     throw std::logic_error("the tag does not exist."); 

    // print the values (caution: count is in bytes) 
    for(int index = 0; index < count/sizeof(double); ++index) 
     std::cout << data[index]; 
    TIFFClose(tif); // close the file 
} 
else 
    throw std::runtime_error("cannot open the file"); 

 Смежные вопросы

  • Нет связанных вопросов^_^