C#でJPEGファイルからメタデータ(具体的には、取得日)を読み取る適切な方法を探していましたが、少し不足しています。私の知る限り、既存の情報は次のようなコードを示しています。
BitmapMetadata bmd = (BitmapMetadata)frame.Metadata;
string a1 = (string)bmd.GetQuery("/app1/ifd/exif:{uint=36867}");
しかし、私の知らないところで、GetQuery()がメタデータのどのビットを返すのか、何を渡すのかわかりません。
最初にXMPを読み取って、XMPが存在しない場合はEXIFにフォールバックしたい。これを行う簡単な方法はありますか?
ありがとう。
以下はうまく機能しているようですが、何か悪い点があれば、コメントをいただければ幸いです。
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;
}
}
私は長年のオープンソース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);
このライブラリは、Java用のAdobeのXmpCoreライブラリのC#ポートを介して、XMPデータもサポートします。
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;
}
}
System.DateTakenハンドラーが自動的に適用するので、あなたがしていることは良い解決策だと思います 写真メタデータポリシー 他の名前空間にフォールバックして、値が存在するかどうかを確認します。