18

我一直在寻找一种从 C# 中的 JPEG 文件中读取元数据(特别是拍摄日期)的体面方法,但我发现有点短。据我所知,现有信息显示如下代码;

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

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

我想先尝试读取 XMP,如果 XMP 不存在则回退到 EXIF。有没有一种简单的方法可以做到这一点?

谢谢。

4

5 回答 5

29

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

    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;
        }
    }
于 2010-02-17T15:01:56.580 回答
9

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

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

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

于 2015-08-12T11:46:00.193 回答
3

如果您正在为 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;
    }
}
于 2017-01-10T14:53:03.383 回答
1

我认为您正在做的是一个很好的解决方案,因为 System.DateTaken 处理程序会自动应用返回到其他名称空间的照片元数据策略以查找值是否存在。

于 2010-05-03T22:48:32.350 回答
-4

我的公司制作了一个包含 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。

于 2010-02-17T13:41:02.807 回答