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

时间:2010-02-17 13:26:51

标签: c# jpeg exif xmp

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

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

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

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

感谢。

5 个答案:

答案 0 :(得分:24)

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

    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;
        }
    }

答案 1 :(得分:5)

我最近将我的长期开源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);

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

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

答案 2 :(得分:1)

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

修改

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

答案 3 :(得分:1)

如果您正在努力使用XMP jn jpeg,这可行。它没有被称为残酷!

public class BrutalXmp
{
    public XmlDocument ExtractXmp(byte[] jpegBytes)
    {
        var asString = Encoding.UTF8.GetString(jpegBytes);
        var start = asString.IndexOf("<x:xmpmeta");
        var end = asString.IndexOf("</x:xmpmeta>") + 12;
        if (start == -1 || end == -1)
            return null;
        var justTheMeta = asString.Substring(start, end - start);
        var returnVal = new XmlDocument();
        returnVal.LoadXml(justTheMeta);
        return returnVal;
    }
}

答案 4 :(得分:-2)

我的company创建了一个包含XMP和EXIF解析器的.NET toolkit

典型的过程是这样的:

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。