2015-11-04 56 views
1

我想要讀取tiff文件中的自定義標籤。如何閱讀自定義TIFF標籤(不帶TIFFFieldInfo)

關於這個主題的指令很少,但是AFAIK他們使用一個名爲TIFFFieldInfo的接口(結構體)。我已經閱讀了documentation,並再次出現了TIFFFieldInfo。 我可以用它,但他們(the library)說,該接口是OBSOLETED。你能建議我合理的選擇嗎? 或者我只是誤解了頭文件?

+1

如果你不能找到任何UPTODATE庫,從頭開始編寫一個TIFF信息的讀者是不是很難;該文件非常簡單。 (我是在一年前製作的;我會看看我能否找到源代碼,但現在可能已經過時了。) –

回答

1

最後我找到了解決方案。 說明書(TIFFGetField(3tiff))說明了我們所需要的一切。參見AUTOREGISTERED TAGS會話。以下是複製粘貼的一個。

AUTOREGISTERED標籤。如果你不能找到在 上表中的標記,則意味着這是一個不受支持的標籤,而不是直接的libtiff(3TIFF)庫支持 。如果您知道該標籤的數據類型,您仍然可以閱讀 它的值。例如,如果您 想從 讀取標籤33424和ASCII字符串的LONG值,可以使用下面的代碼標籤36867:

uint32 count; 
void *data; 

TIFFGetField(tiff, 33424, &count, &data); 
printf("Tag %d: %d, count %d0", 33424, *(uint32 *)data, count); 
TIFFGetField(tiff, 36867, &count, &data); 
printf("Tag %d: %s, count %d0", 36867, (char *)data, count); 

例如,我需要閱讀標籤,它是雙層,所以我用下面的代碼(但我沒有檢查):

tiff *tif = TIFFOpen("ex_file.tif", "rc"); // read tif 
static ttag_t const TIFFTAG_SOMETAG = 34362; // some custom tag 
if(tif != nullptr) // if the file is open 
{ 
    uint count; // get count 
    double *data; // get data 
    if(TIFFGetField(tif, TIFFTAG_SOMETAG, &count, &data) == 1) // read tag 
     throw std::logic_error("the tag does not exist."); 

    // print the values (caution: count is in bytes) 
    for(int index = 0; index < count/sizeof(double); ++index) 
     std::cout << data[index]; 
    TIFFClose(tif); // close the file 
} 
else 
    throw std::runtime_error("cannot open the file");