2015-11-04 36 views
1

我想要读取tiff文件中的自定义标签。如何阅读自定义TIFF标签(不带TIFFFieldInfo)

关于这个主题的指令很少,但是AFAIK他们使用一个名为TIFFFieldInfo的接口(结构体)。我已经阅读了documentation,并再次出现了TIFFFieldInfo。 我可以用它,但他们(the library)说,该接口是OBSOLETED。你能建议我合理的选择吗? 或者我只是误解了头文件?

+1

如果你不能找到任何UPTODATE库,从头开始编写一个TIFF信息的读者是不是很难;该文件非常简单。 (我是在一年前制作的;我会看看我能否找到源代码,但现在可能已经过时了。) –

回答

1

最后我找到了解决方案。 说明书(TIFFGetField(3tiff))说明了我们所需要的一切。参见AUTOREGISTERED TAGS会话。以下是复制粘贴的一个。

AUTOREGISTERED标签。如果你不能找到在 上表中的标记,则意味着这是一个不受支持的标签,而不是直接的libtiff(3TIFF)库支持 。如果您知道该标签的数据类型,您仍然可以阅读 它的值。例如,如果您 想从 读取标签33424和ASCII字符串的LONG值,可以使用下面的代码标签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");