我目前正在开展一个项目,该项目要求我将TIFF图像拆分为包含所有标签的文件和包含所有图像数据的文件,并从这些文件重建TIFF图像。唯一的问题是,似乎LibTIFF没有提供从图像中获取所有标签的简单方法。我尝试使用TIFFGetTagListCount然后使用TIFFGetField来检索标记,但这只返回了一小部分标记。我已经开始推出自己的版本了,但我只想仔细检查并确保我不会忽略某些内容,因为这似乎是一个非常明显的功能,应该包含在库中。
答案 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_customValues
是td_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一起提供)实现了这一点,但是查看代码,看起来它们主要是在库中工作。实际上,他们会调用lseek
和read
来阅读标记信息。
答案 5 :(得分:0)
答案 6 :(得分:0)
更正了上面cgohlke的答案中发现的for循环问题。还扩展了更完整的脚本,因此更容易从命令行运行。
(uint32_t)pData[0] >> 5