私は現在、TIFF 画像をすべてのタグを含むファイルとすべての画像データを含むファイルに分割し、これらのファイルから TIFF 画像を再構築する必要があるプロジェクトに取り組んでいます。唯一の問題は、LibTIFF が画像からすべてのタグを取得する簡単な方法を提供していないように見えることです。TIFFGetTagListCount を使用してから TIFFGetField を使用してタグを取得しようとしましたが、これはタグの小さなサブセットしか返しません。私は自分のバージョンを展開し始めましたが、これはライブラリに含める必要がある非常に明白な機能のように思われるため、何かを見落としていないことを再確認したいだけです。
7 に答える
以下は、すべてのタグをスキャンするために取得できるクローズです。
#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
}
一部のタグは 2 回 (LONG バージョンと SHORT バージョン) 表示されることを考慮する必要がありますが、これらのうちの1 つだけが値を持ちます。使用する正しい型は、含まれているヘッダー (TIFFDirectory 構造体) で検索できます。
タグの読み取り方法には他にも問題がありますが、これにより、少なくともそれらすべて (標準のもの) をループすることになります。行き詰まった場合のポインターについては、tif_dirinfo.c を参照してください。
すべてのタグを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)
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 構造体リファレンスを参照してください。それが役立つことを願っています。
これも役に立つかもしれません: http://www.lfd.uci.edu/~gohlke/code/tifffile.py.html
tiffdumpユーティリティ( libtiffに付属) はこれを実現しますが、コードを見ると、ほとんどがライブラリを回避しているように見えます。実際に と を呼び出しlseek
てread
、タグ情報を読み取ります。