18

私はC#のJPEGファイルからメタデータ(具体的には取得日)を読み取る適切な方法を探していましたが、少し短くなっています。私が見る限り、既存の情報は次のようなコードを示しています。

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

しかし、私の知らないうちに、GetQuery()のメタデータのどのビットが返されるのか、それを何に渡すのかがわかりません。

最初にXMPの読み取りを試み、XMPが存在しない場合はEXIFにフォールバックします。これを行う簡単な方法はありますか?

ありがとう。

4

5 に答える 5

29

以下はうまくいくようですが、何か悪いことがあればコメントをいただければ幸いです。

    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;
        }
    }
于 2010-02-17T15:01:56.580 に答える
9

最近、長年のオープンソース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データもサポートします。

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

于 2015-08-12T11:46:00.193 に答える
3

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;
    }
}
于 2017-01-10T14:53:03.383 に答える
1

System.DateTakenハンドラーは、値が存在するかどうかを確認するために他の名前空間にフォールバックするPhotoメタデータポリシーを自動的に適用するため、あなたが行っていることは良い解決策だと思います。

于 2010-05-03T22:48:32.350 に答える
-4

私の会社は、 XMPおよびEXIFパーサーを含む.NETツールキットを作成しています。

典型的なプロセスは次のようなものです。

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になります。

于 2010-02-17T13:41:02.807 に答える