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

tsv*_*der 15 c# xmp jpeg exif metadata

我一直在寻找一种体面的方式来读取C#中JPEG文件的元数据(特别是日期),并且有点短暂.据我所知,现有信息显示如下代码;

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

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

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

谢谢.

tsv*_*der 26

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

    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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • @ springy76,实际上你有点不公平.在Exif数据中,日期表示为字符串.有些摄像机使用不同的格式,因此不能保证MS可以编写代码来成功解析它遇到的任何日期字符串.至少它会将原始字符串传递给您,以便您可以调试正在进行的操作. (13认同)
  • 微软实施`BitmapMetaData.DateTaken`的人是一个完美的IDIOT!1.为什么它完全是"字符串"?`get`的最后一行是`DateTime.ToString()`,`set`的第一行是`Convert.ToDateTime()`.和2:`get`返回特定于文化的字符串,`set`需要文化不敏感的字符串.MICROSOFT是否有任何质量管理? (5认同)

Dre*_*kes 6

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

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

var directories = ImageMetadataReader.ReadMetadata(imagePath);
var subIfdDirectory = directories.OfType<ExifSubIfdDirectory>().FirstOrDefault();
var dateTime = subIfdDirectory?.GetDescription(ExifDirectoryBase.TagDateTime);
Run Code Online (Sandbox Code Playgroud)

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

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