2013-02-17 22 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