7

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

4

7 回答 7

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 以获取指针。

于 2010-07-02T16:28:53.297 回答
4

使用tifffile打印所有标签:

from tifffile import TiffFile
for page in TiffFile(path_to_file).pages:
    for tag in page.tags.values():
        print(tag.name, tag.code, tag.dtype, tag.count, tag.value)
于 2009-12-15T06:22:16.597 回答
1

libtiff 文档中的 addedtags.html包含有关处理非标准标签的信息(默认情况下它们被忽略)。这可能是问题吗?

于 2009-12-15T02:46:13.990 回答
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 结构参考。希望有帮助。

于 2009-12-15T02:50:17.027 回答
0

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

于 2009-12-15T02:51:00.730 回答
0

这也可能有用: http ://www.lfd.uci.edu/~gohlke/code/tifffile.py.html

于 2009-12-15T03:09:40.513 回答
0

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

import sys, getopt
from tifffile import TiffFile

def PrintAll(path_to_file):
    print('Tag.Name, Tag.Code, Tag.DType, Tag.Count, Tag.Value')
    for page in TiffFile(path_to_file).pages:
        for tag in page.tags.values():
            print(tag.name, tag.code, tag.dtype, tag.count, tag.value)

def main(argv):
    try:
        opts, args = getopt.getopt(argv, 'hi:v', ["help","image="])
    except getopt.GetoptError:
        print('Argv error')
        sys.exit(2)
    for opt, arg in opts:
        if opt in ('-h', '--help'):
            print('printalltifftags.py -i c:\images\myimage.tif')
            sys.exit(0)
        elif opt in ('-i', '--image'):
            filePath = arg
    print('Image: ' + filePath)
    PrintAll(filePath)

if __name__ == '__main__':
    main(sys.argv[1:])
于 2020-01-27T16:06:13.883 回答