在C#中从JPEG,XMP或EXIF读取数据元数据

我一直在寻找一种体面的方式来读取C#中JPEG文件的元数据(具体来说,是采用的日期),而且我的发布时间有点短。 据我所知,现有信息显示如下代码;

BitmapMetadata bmd = (BitmapMetadata)frame.Metadata; string a1 = (string)bmd.GetQuery("/app1/ifd/exif:{uint=36867}"); 

但在我的无知中,我不知道GetQuery()将返回什么位元数据,或者传递什么。

我想首先尝试读取XMP,如果XMP不存在则回退到EXIF。 有一个简单的方法吗?

谢谢。

以下似乎很好地工作,但如果有什么不好的,我会感激任何评论。

  public string GetDate(FileInfo f) { using(FileStream fs = new FileStream(f.FullName, FileMode.Open, FileAccess.Read, FileShare.Read)) { BitmapSource img = BitmapFrame.Create(fs); BitmapMetadata md = (BitmapMetadata)img.Metadata; string date = md.DateTaken; Console.WriteLine(date); return date; } } 

我最近将我的长期开源Java库移植到.NET,它支持XMP,Exif,ICC,JFIF以及各种图像格式的更多类型的元数据。 它肯定会实现你所追求的目标。

https://github.com/drewnoakes/metadata-extractor-dotnet

 var directories = ImageMetadataReader.ReadMetadata(imagePath); var subIfdDirectory = directories.OfType().FirstOrDefault(); var dateTime = subIfdDirectory?.GetDescription(ExifDirectoryBase.TagDateTime); 

该库还通过Adobe的Java XmpCore库的C#端口支持XMP数据。

https://github.com/drewnoakes/xmp-core-dotnet

我认为你正在做的是一个很好的解决方案,因为System.DateTaken处理程序自动应用回退到其他命名空间的Photo元数据策略来查找是否存在值。

编辑:

更新链接 – http://msdn.microsoft.com/en-us/library/windows/desktop/ee872003(v=vs.85).aspx

如果您正在努力使用XMP jn jpeg,这可行。 它不是什么都没有残酷!

 public class BrutalXmp { public XmlDocument ExtractXmp(byte[] jpegBytes) { var asString = Encoding.UTF8.GetString(jpegBytes); var start = asString.IndexOf(" 

我的公司制作了一个包含XMP和EXIF解析器的.NET 工具包 。

典型的过程是这样的:

 XmpParser parser = new XmpParser(); System.Xml.XmlDocument xml = (System.Xml.XmlDocument)parser.ParseFromImage(stream, frameIndex); 

对于EXIF你会这样做:

 ExitParser parser = new ExifParser(); ExifCollection exif = parser.ParseFromImage(stream, frameIndex); 

很明显,对于JPEG,frameIndex将为0。