如何阅读自定义TIFF标签(没有TIFFFieldInfo)

时间:2015-11-04 12:58:08

标签: c++ c tiff libtiff

我正在尝试在tiff文件中读取自定义标记。

关于这个主题的指令很少,但是AFAIK他们使用的是一个名为TIFFFieldInfo的接口(struct)。我已经阅读了documentation,并再次显示了TIFFFieldInfo。 我可以继续使用它,但是他们(the library)说,该界面已经过时了。你能给我一些合理的选择吗? 或者我只是误解了头文件?

1 个答案:

答案 0 :(得分:2)

最后,我找到了解决方案。 手册(TIFFGetField(3tiff))表示我们所需要的一切。请参阅AUTOREGISTERED TAGS会话。以下是复制粘贴的。

  

AUTOREGISTERED TAGS如果您无法在上表中找到该标签   表示这是一个不受支持的标签,不是直接的   由libtiff(3TIFF)库支持。你仍然可以阅读   如果您知道该标签的数据类型,那么它就是值。例如,如果你   想要读取标签33424中的LONG值和来自的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);

例如,我需要读取一个双倍的标签,所以我使用了以下代码(但我没有检查过IT):

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");