2009-12-15 23 views
5

Ich arbeite gerade an einem Projekt, bei dem ich ein TIFF-Bild in eine Datei mit allen Tags und einer Datei mit allen Bilddaten aufteilen und ein TIFF-Bild aus diesen Dateien rekonstruieren soll . Das einzige Problem ist, dass LibTIFF anscheinend keine einfache Möglichkeit bietet, alle Tags eines Bildes zu erfassen. Ich habe versucht, mit TIFFGetTagListCount und dann TIFFGetField das Tag abzurufen, aber das gibt nur eine kleine Teilmenge der Tags zurück. Ich habe angefangen, meine eigene Version zu rollen, aber ich möchte nur überprüfen, ob ich etwas übersehen habe, da dies ein ziemlich offensichtliches Feature ist, das in der Bibliothek enthalten sein sollte.LibTIFF: Alle Tags aus einem TIFF-Bild extrahieren

+0

Aus Neugier haben Sie eine Lösung für dieses Problem gefunden? –

Antwort

1

addingtags.html in the libtiff documentation enthält Informationen zum Umgang mit nicht standardmäßigen Tags (standardmäßig werden sie ignoriert). Könnte das das Problem sein?

+0

Nicht standardmäßige Tags sind nicht das Problem, da einfache Standard-Tags wie TIFF_IMAGEWIDTH und TIFF_IMAGELENGTH anscheinend nicht in die Anzahl der Tag-Listen aufgenommen werden. Es ist eigentlich ziemlich seltsam. –

1

Sie können tif_dir Feld des Bildes verwenden. Es ist eine Struktur mit mindestens den folgenden Feldern:

  • td_customValueCount enthält die Anzahl der ‚kundenspezifischen‘ -Tag Zählungen
  • td_customValues ist die Liste der td_customValueCount Variablenwerte (von 0 indexiert), und ist vom Typ TIFFTagValue * .

So sollen Sie in der Lage sein, so etwas zu tun (in wahrer Art und Weise von Online-Code, dann ist dies nicht getestet, natürlich!):

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 See. Ich hoffe, das hilft.

0

Das Dienstprogramm tiffdump (das mit libtiff geliefert wird) führt dies aus, aber wenn man sich den Code anschaut, sieht es so aus, als würden sie hauptsächlich in der Bibliothek arbeiten. Sie rufen tatsächlich lseek und read, um die Tag-Informationen zu lesen.

4

Drucken Alle Tags mit 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 
5

Hier wird das schließt Sie für das Scannen aller Tags erhalten können:

#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 


    } 

Beachten Sie, dass Sie müssen berücksichtigen, dass einige Tags zweimal erscheinen (LONG und SHORT Version), aber nur eine von diesen wird Wert haben. Der richtige zu verwendende Typ kann im Header (TIFFDirectory struct) nachgeschlagen werden.

Es gibt auch andere Fänge auf, wie man die Tags liest, aber das wird zumindest machen Sie Schleife über alle von ihnen (die Standard). Tipps finden Sie unter tif_dirinfo.c, wenn Sie nicht weiterkommen.

+0

Nun, da 'tif_dir.h' eine interne Kopfzeile ist (d. H. Nicht von der eingebauten Bibliothek offen gelegt wurde), verursacht sie alle möglichen Probleme wie Neudefinitionen, fehlende Abhängigkeiten, etc. Irgendwelche anderen Möglichkeiten? –

+0

@Anish Ramaswamy Nicht, dass ich weiß. Wie gesagt, wird dies von der LibTIFF-Quelle reverse-engineered. Wenn Sie Probleme mit Neudefinitionen haben, versuchen Sie, sie in einer separaten Übersetzungseinheit oder einer kleinen Bibliothek zu isolieren.Wie für fehlende Deklination. - Andere Includes müssen ebenfalls hinzugefügt werden. IIRC, nur Header werden tun, keine Notwendigkeit, irgendwelche .c von der lib zu kompilieren. – user362515

+0

Das scheint einfach unelegant zu sein. Ich bin immer noch auf der Jagd. Vielen Dank! –

Verwandte Themen