我一直在寻找一种体面的方式来阅读C#中JPEG文件的元数据(具体来说,是采用的日期),并且有点短暂。据我所知,现有信息显示如下代码;
BitmapMetadata bmd = (BitmapMetadata)frame.Metadata;
string a1 = (string)bmd.GetQuery("/app1/ifd/exif:{uint=36867}");
但是在我的无知中,我不知道GetQuery()会返回什么样的元数据,或者传递什么。
我想首先尝试读取XMP,如果XMP不存在则回退到EXIF。有一种简单的方法吗?
感谢。
答案 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数据。
答案 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。