LibTIFF: Извлеките все теги из изображения в формате TIFF

Я в настоящее время работаю над проектом, который требует, чтобы я разделил изображение в формате TIFF на файл, содержащий все теги и файл, содержащий все данные изображения, и восстановил изображение в формате TIFF из этих файлов. Единственная проблема состоит в том, что кажется, что LibTIFF не обеспечивает простого способа захватить все теги из изображения. Я попытался использовать TIFFGetTagListCount и затем TIFFGetField для получения тега, но это только возвращает небольшое подмножество тегов. Я начал прокручивать свою собственную версию, но я просто хочу проверить дважды и удостовериться, что я не пропускаю что-то, поскольку это походит на довольно очевидную функцию, которая должна быть включена в библиотеку.

7
задан Eric Scrivner 15 December 2009 в 02:21
поделиться

6 ответов

Печать всех тегов с помощью 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
4
ответ дан 6 December 2019 в 23:06
поделиться

Вы можете использовать поле 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 . Надеюсь, это поможет.

1
ответ дан 6 December 2019 в 23:06
поделиться

Утилита tiffdump (которая поставляется с libtiff) выполняет это, но, глядя на код, похоже, что они в основном работают с библиотекой. Они фактически вызывают lseek и read , чтобы прочитать информацию о теге.

0
ответ дан 6 December 2019 в 23:06
поделиться

Это также может быть полезно: http://www.lfd.uci.edu/~gohlke/code/tifffile.py.html

0
ответ дан 6 December 2019 в 23:06
поделиться

addtags.html в документации libtiff содержит информацию по работе с нестандартными тегами (по умолчанию они игнорируются). Может ли это быть проблемой?

.
1
ответ дан 6 December 2019 в 23:06
поделиться

Вот закрытие, которое вы можете получить для сканирования всех тегов:

 #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 для указателей, если вы застряли.

5
ответ дан 6 December 2019 в 23:06
поделиться