Lectura de metadatos de datos de JPEG, XMP o EXIF ​​en C#

Lectura de metadatos de datos de JPEG, XMP o EXIF ​​en C#

Lo siguiente parece funcionar bien, pero si hay algo malo al respecto, agradecería cualquier comentario.

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

He transferido mi biblioteca Java de código abierto desde hace mucho tiempo a .NET recientemente, y es compatible con XMP, Exif, ICC, JFIF y muchos más tipos de metadatos en una variedad de formatos de imagen. Definitivamente logrará lo que buscas.

https://github.com/drewnoakes/metadata-extractor-dotnet

var directories = ImageMetadataReader.ReadMetadata(imagePath);
var subIfdDirectory = directories.OfType<ExifSubIfdDirectory>().FirstOrDefault();
var dateTime = subIfdDirectory?.GetDescription(ExifDirectoryBase.TagDateTime);

Esta biblioteca también admite datos XMP, a través de un puerto C# de la biblioteca XmpCore de Adobe para Java.

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


Si tiene problemas con XMP jn jpeg, esto funciona. ¡No se llama brutal por nada!

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