我正在尝试在tiff文件中读取自定义标记。
关于这个主题的指令很少,但是AFAIK他们使用的是一个名为TIFFFieldInfo的接口(struct)。我已经阅读了documentation,并再次显示了TIFFFieldInfo。 我可以继续使用它,但是他们(the library)说,该界面已经过时了。你能给我一些合理的选择吗? 或者我只是误解了头文件?
答案 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");