2014-07-14 41 views
0
 using (Tiff iimage = Tiff.Open("new.tif", "r")) 
     { 
      Tiff newiimage = Tiff.Open("newnew.tif", "w"); 
      if (image == null) 
      { 
       MessageBox.Show("Could not open incoming image"); 
       return; 
      } 

      using (StreamWriter writer = new StreamWriter("EnumerateTiffTags.txt")) 
      { 
       short numberOfDirectories = iimage.NumberOfDirectories(); 
       for (short d = 0; d < numberOfDirectories; ++d) 
       { 
       iimage.SetDirectory((short)d); 

       for (ushort t = ushort.MinValue; t < ushort.MaxValue; ++t) 
       { 
        TiffTag tag = (TiffTag)t; 
        var value = iimage.GetField(tag); 
        if (value != null) 
        { 
        for (int j = 0; j < value.Length; j++) 
        { 
         writer.WriteLine("{0}", tag.ToString()); 
         writer.WriteLine("{0} : {1}", 
          value[j].Value.GetType().ToString(), value[j].ToString()); 
        } 
        newiimage.SetField(tag, value);// this line is giving me.. 
    // an error "Unable to cast object of type 'BitMiracle.LibTiff.Classic.FieldValue[]' 
    // to type 'System.IConvertible'" 
        } 
       } 
      } 
     } 
    } 

我正在打開讀取標記值並將它們寫入另一個TIFF文件的文件。 SetField函數中出現問題。 我試着調試它,一切都很好,不能完全弄清楚,爲什麼它會拋出一個錯誤。使用Libtiff複製TIFF圖像

回答

1

按照GetField方法有在其返回一套真正和僞標籤的文件。

TiffTag.JPEGQUALITY是一個僞標籤的例子。

您不能設置僞標籤,因此您必須將它們從寫入循環中排除。

Well-known tags列表可以幫助你寫一個過濾器..

它也可能有必要寫出來,不能寫盡過濾器更完整的標籤。

我不知道僞標記的確切性質,但給出的TIFF格式的開放性,你可能明智的,包括錯誤處理unexepected後來者..

+0

好的謝謝你的信息....所以,通過複製標籤複製TIFF圖像並不像我想的那麼簡單 – harsha217

+0

好吧,首先,你可以嘗試簡單地包裝SetField在try-catch塊中,並記錄/寫出要檢查的失敗標籤,如果它們確實是僞標籤。 – TaW

+0

你的想法幫助我過濾它們。所以,我還有一個問題。如何設置僞標籤(Compression,Photometric,ResUnit等在我的圖像中)?我們應該手動設置它們全部? – harsha217

1

在LibTiff中,我正在使用SetField方法期望的是實際值,而不是FieldValue對象。所以,你可以嘗試這樣的事:

newiimage.SetField(tag, value.Select(v => v.Value).ToArray()); 
+0

感謝您的答覆。那麼,在你的解決方案中,「價值」的數據類型是什麼?因爲我試圖提取和複製所有標籤,「價值」可能是任何東西,對吧?請原諒我,如果我的方法似乎天真 – harsha217