Чтение метаданных данных из JPEG, XMP или EXIF ​​в C # - PullRequest
14 голосов
/ 17 февраля 2010

Я искал приличный способ чтения метаданных (в частности, взятой даты) из файлов JPEG в C #, и сейчас я немного подхожу. Насколько я понимаю, существующая информация показывает код, подобный следующему:

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

Но в своем незнании я понятия не имею, какой бит метаданных вернет GetQuery (), или что его передать.

Я хочу сначала попытаться прочитать XMP, возвращаясь к EXIF, если XMP не существует. Есть ли простой способ сделать это?

Спасибо.

Ответы [ 5 ]

26 голосов
/ 17 февраля 2010

Кажется, что следующее работает хорошо, но если в этом есть что-то плохое, я буду благодарен за любые комментарии.

    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;
        }
    }
5 голосов
/ 12 августа 2015

Я недавно перенес свою давнюю библиотеку 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 через порт C # библиотеки Adobe XmpCore для Java.

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

1 голос
/ 10 января 2017

Если вы боретесь с 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;
    }
}
1 голос
/ 04 мая 2010

Я думаю, что то, что вы делаете, является хорошим решением, потому что обработчик System.DateTaken автоматически применяет Политики метаданных фотографии для отката в другие пространства имен, чтобы найти, существует ли значение.

0 голосов
/ 17 февраля 2010

Моя компания создает набор инструментов .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.

...