Я в настоящее время работаю над проектом, который требует, чтобы я разделил изображение в формате TIFF на файл, содержащий все теги и файл, содержащий все данные изображения, и восстановил изображение в формате TIFF из этих файлов. Единственная проблема состоит в том, что кажется, что LibTIFF не обеспечивает простого способа захватить все теги из изображения. Я попытался использовать TIFFGetTagListCount и затем TIFFGetField для получения тега, но это только возвращает небольшое подмножество тегов. Я начал прокручивать свою собственную версию, но я просто хочу проверить дважды и удостовериться, что я не пропускаю что-то, поскольку это походит на довольно очевидную функцию, которая должна быть включена в библиотеку.
Печать всех тегов с помощью 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
Вы можете использовать поле 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 . Надеюсь, это поможет.
Утилита tiffdump (которая поставляется с libtiff) выполняет это, но, глядя на код, похоже, что они в основном работают с библиотекой. Они фактически вызывают lseek
и read
, чтобы прочитать информацию о теге.
Это также может быть полезно: http://www.lfd.uci.edu/~gohlke/code/tifffile.py.html
addtags.html в документации libtiff содержит информацию по работе с нестандартными тегами (по умолчанию они игнорируются). Может ли это быть проблемой?
.Вот закрытие, которое вы можете получить для сканирования всех тегов:
#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
}
Обратите внимание, что вы должны принять во внимание, что некоторые теги будут отображаться дважды (ДЛИННАЯ и КОРОТКАЯ версии), но только один из них будет иметь ценность. Правильный тип для использования можно найти во включенном заголовке (структура TIFFDirectory).
Есть и другие уловки о том, как читать теги, но это, по крайней мере, заставит вас перебрать их все (стандартные). См. Tif_dirinfo.c для указателей, если вы застряли.