Чтение метаданных данных из JPEG, XMP или EXIF в С#
Я искал достойный способ чтения метаданных (в частности, даты) из файлов JPEG на С#, и я немного подхожу. Существующая информация, насколько я могу видеть, показывает код следующим образом:
BitmapMetadata bmd = (BitmapMetadata)frame.Metadata;
string a1 = (string)bmd.GetQuery("/app1/ifd/exif:{uint=36867}");
Но, по моему невежеству, я понятия не имею, какая часть метаданных GetQuery() вернется или что передать.
Я хочу сначала попробовать прочитать XMP, вернуться к EXIF, если XMP не существует. Есть ли простой способ сделать это?
Спасибо.
Ответы
Ответ 1
Следующее, кажется, работает красиво, но если у вас что-то плохое, я буду благодарен за любые комментарии.
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;
}
}
Ответ 2
Недавно я портировал свою давнюю библиотеку 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);
Эта библиотека также поддерживает данные XMP через порт С# библиотеки Adobe XmpCore для Java.
https://github.com/drewnoakes/xmp-core-dotnet
Ответ 3
Я думаю, что вы делаете, это хорошее решение, потому что обработчик System.DateTaken автоматически применяет политики метаданных Photo для отката к другим пространствам имен, чтобы определить, существует ли значение.
Ответ 4
Если вы боретесь с 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;
}
}
Ответ 5
My компания создает инструментарий .NET который включает в себя синтаксические анализаторы XMP и EXIF.
Типичный процесс выглядит примерно так:
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);
очевидно, frameIndex будет 0 для JPEG.