LibTIFF: извлечь все теги из изображения TIFF - PullRequest
6 голосов
/ 15 декабря 2009

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

Ответы [ 6 ]

5 голосов
/ 02 июля 2010

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

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

4 голосов
/ 15 декабря 2009

Печать всех тегов с 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
1 голос
/ 15 декабря 2009

Вы можете использовать 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 голос
/ 15 декабря 2009

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

0 голосов
/ 15 декабря 2009

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

0 голосов
/ 15 декабря 2009

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

...