2013-02-17 43 views
1

我試圖從使用元數據類的tiff文件中提取時間信息;以下是時間信息在tiff文件中的部分:BitmapMetadata.GetQuery()拋出「元數據查詢請求無效」

<Plane TheZ="0" TheT="0" TheC="0" DeltaT="0.2345"/> 

其中0.2345是我嘗試提取的信息。 這裏是我的代碼,試圖把它弄出來:

string searchtext = "DeltaT="; 
FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); 
      TiffBitmapDecoder tbd = new TiffBitmapDecoder(stream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); 

      if (tbd.Frames[0] != null && tbd.Frames[0].Metadata != null) 
      { 
       //BitmapMetadata bmd = new BitmapMetadata("tiff"); 

       BitmapMetadata bmd = tbd.Frames[0].Metadata as BitmapMetadata; 

       bmd.GetQuery(@searchText);    

      } 

然而,行bmd.GetQuery(@searchText);拋出異常"Metadata query request is not valid";我不知道如何改變它以獲得0.2345的值。任何人有任何想法?非常感謝。

這裏是TIFF文件,這樣你可以看看:http://dl.dropbox.com/u/105139407/ChanA_0001_0001_0001_0003.tif

+0

您可以上傳TIFF文件,以便我們看看? – 2013-02-17 22:25:25

+0

當然。這是它:http://dl.dropbox.com/u/105139407/ChanA_0001_0001_0001_0003.tif – 2013-02-17 22:34:50

回答

2

顯然,你正在尋找的XML是「/ IFD/{USHORT = 270}」(不要問我爲什麼 - 我不知道TIFF元數據應該如何......)。請注意,它將返回整個XML文檔,因此您仍然需要解析它。此代碼檢索的DeltaT值:

var decoder = new TiffBitmapDecoder(new Uri(fileName), BitmapCreateOptions.None, BitmapCacheOption.Default); 
var metadata = (BitmapMetadata)decoder.Frames[0].Metadata; 
string xml = (string)metadata.GetQuery("/ifd/{ushort=270}"); 
var doc = XDocument.Parse(xml); 
var ns = doc.Root.GetDefaultNamespace(); 
var plane = doc.Root.Element(ns + "Image") 
        .Element(ns + "Pixels") 
        .Element(ns + "Plane"); 
double deltaT = (double)plane.Attribute("DeltaT"); 

編輯:這裏有一個LINQPad劇本我用它來快速瀏覽一下在圖像的元數據:http://pastebin.com/daBTdW33。隨意使用它或適應您的需求;)

+0

太棒了,雖然它說System.Windows.Xml.Linq.XDocument不包含方法Dump();我正在使用System.Linq,System.Xml,並添加了System.Xml.Linq;也許我應該使用其他東西? – 2013-02-17 22:55:36

+0

@NickTsui,「.Dump()」只是我忘記刪除的東西...這是LINQPad中可用的擴展方法來打印變量的值。 – 2013-02-17 23:00:21

+0

我明白了。那麼我應該做一些改變以使Dump()工作嗎?像添加使用,名稱空間....類似的東西?聽起來像我不需要它?謝謝。 – 2013-02-17 23:05:39