Domanda

Ho cercato un modo decente per leggere i metadati (in particolare, la data acquisita) dai file JPEG in C# e mi sto avvicinando un po'.Le informazioni esistenti, per quanto posso vedere, mostrano un codice come il seguente;

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

Ma nella mia ignoranza non ho idea di quale bit di metadati GetQuery() restituirà o cosa trasmetterlo.

Voglio provare prima a leggere XMP, tornando a EXIF ​​se XMP non esiste.Esiste un modo semplice per farlo?

Grazie.

È stato utile?

Soluzione

Quanto segue sembra funzionare bene, ma se c'è qualcosa di negativo, apprezzerei qualsiasi commento.

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

Altri suggerimenti

Di recente ho portato la mia libreria Java open source di lunga data su .NET e supporta XMP, Exif, ICC, JFIF e molti altri tipi di metadati in una vasta gamma di formati di immagine.Otterrà sicuramente ciò che stai cercando.

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

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

Questa libreria supporta anche i dati XMP, tramite un port C# della libreria XmpCore di Adobe per Java.

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

Se hai difficoltà con XMP jn jpeg, funziona.Non per niente viene definito brutale!

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

Penso che quello che stai facendo sia una buona soluzione perché il gestore System.DateTaken si applica automaticamente Politiche sui metadati delle foto di ricorrere ad altri spazi dei nomi per scoprire se esiste un valore.

Mio azienda crea un .NET kit di strumenti che include parser XMP ed EXIF.

Il processo tipico è qualcosa del genere:

XmpParser parser = new XmpParser();
System.Xml.XmlDocument xml = (System.Xml.XmlDocument)parser.ParseFromImage(stream, frameIndex);

per EXIF ​​dovresti fare questo:

ExitParser parser = new ExifParser();
ExifCollection exif = parser.ParseFromImage(stream, frameIndex);

ovviamente frameIndex sarebbe 0 per JPEG.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top