LibTIFF:从TIFF图像中提取所有标签

时间:2009-12-15 02:21:27

标签: c++ c tiff libtiff

我目前正在开展一个项目,该项目要求我将TIFF图像拆分为包含所有标签的文件和包含所有图像数据的文件,并从这些文件重建TIFF图像。唯一的问题是,似乎LibTIFF没有提供从图像中​​获取所有标签的简单方法。我尝试使用TIFFGetTagListCount然后使用TIFFGetField来检索标记,但这只返回了一小部分标记。我已经开始推出自己的版本了,但我只想仔细检查并确保我不会忽略某些内容,因为这似乎是一个非常明显的功能,应该包含在库中。

7 个答案:

答案 0 :(得分:5)

以下是扫描所有标签时可以获得的结果:

 #include "LibTIFF/tif_dir.h"
 ...

 TIFFDirectory *td = &tif->tif_dir;

 for (int fi = 0, nfi = tif->tif_nfields; nfi > 0; nfi--, fi++) {
    const TIFFFieldInfo* fip = tif->tif_fieldinfo[fi];

    // test if tag value is set
    // (lifted directly form LibTiff _TIFFWriteDirectory)

        if( fip->field_bit == FIELD_CUSTOM ) {
            int ci, is_set = FALSE;

            for( ci = 0; ci < td->td_customValueCount; ci++ )
                is_set |= (td->td_customValues[ci].info == fip);

            if( !is_set )
                continue;
        } else if(!TIFFFieldSet(tif, fip->field_bit))
            continue;

        // else: process the fip->field_tag


    }

请注意,您必须考虑到某些标记会出现两次(LONG和SHORT版本),但这些标记中只有一个会有价值。可以在包含的标题(TIFFDirectory结构)中查找要使用的正确类型。

还有其他关于如何阅读标签的方法,但这至少会让你遍历所有标签(标准标签)。如果你遇到困难,请参阅tif_dirinfo.c以获取指示。

答案 1 :(得分:4)

使用tifffile.py打印所有代码:

from tifffile import TiffFile
for page in TiffFile(path_to_file):
    for tag in page.tags.values():
        print tag.name, tag.code, tag.dtype, tag.count, tag.value

答案 2 :(得分:1)

addingtags.html in the libtiff documentation包含有关处理非标准代码的信息(默认情况下,它们会被忽略)。这可能是问题吗?

答案 3 :(得分:1)

您可以使用图片的tif_dir字段。它是一个至少包含以下字段的结构:

  • td_customValueCount包含“自定义”标记计数
  • td_customValuestd_customValueCount代码值的列表(从0开始索引),类型为TIFFTagValue *

所以你应该可以做这样的事情(以真正的在线代码方式,这当然是未经测试的!):

for (i=0; i < tiffimage->tif_dir->td_customValueCount; ++i) {
    const TIFFFieldInfo *info = tiffimage->tif_dir->td_customValues[i].info;
    const char *tagname = info->field_name();
    /* process tag */
}

TIFFDirectory Struct Reference。希望有所帮助。

答案 4 :(得分:0)

tiffdump实用程序(与libtiff一起提供)实现了这一点,但是查看代码,看起来它们主要是在库中工作。实际上,他们会调用lseekread来阅读标记信息。

答案 5 :(得分:0)

答案 6 :(得分:0)

更正了上面cgohlke的答案中发现的for循环问题。还扩展了更完整的脚本,因此更容易从命令行运行。

(uint32_t)pData[0] >> 5