メモ帳

備忘録

画像のExifデータを取得する。

ExifのTag IDを元に、データを取得する方法。調べてみたところ、BitmapとBitmapFrameでかなり方法が違う。

Exifの仕様については、TsuruZoh Tachibanaya(橘家鶴蔵?)さんによる以下のページが参考になりました。

またExif Tagsに関する情報については、以下のページが参考になりました。

Bitmapの場合

Bitmap bitmap = new Bitmap(inputPath);

int tagId = 0x927C;          // これはMakerNoteのTag ID
PropertyItem item = bitmap.GetPropertyItem(tagId);

// 各種データを取得
int id = item.Id;            // tagIDと同じ値?
int type = item.Type;        // データの型
int length = item.Len;       // データの長さ(バイト単位)
byte[] value = item.Value;   // データ本体

Console.WriteLine("id: {0:X4}, type: {1:D2}, length: {2}", id, type, length);
// id: 927C, type: 07, length: 56438

このように具体的なTag IDを指定してデータを取得する以外にも、画像のExif情報を取得する、設定する: .NET Tips: C#, VB.NETに書かれているように、Bitmap.PropertyItemsをForeachで回すことで全てのExif情報を列挙することもできる。

BitmapFrameの場合

BitmapSourceからはMetadataは取得できないので、(BitmapSourceを継承している)BitmapFrameから取得する必要がある。

Uri uri = new Uri(inputPath, UriKind.Relative);
BitmapFrame frame = BitmapFrame.Create(uri);

BitmapMetadata metadata = frame.Metadata as BitmapMetadata;
int tagIdMakerNote = 0x927C;     // これはMakerNoteのTag ID
string queryMakerNote = string.Format("/app1/ifd/exif/{{uint={0}}}", tagIdMakerNote);
// このクエリは画像のフォーマットによる
bool containsMakerNote = metadata.ContainsQuery(queryMakerNote);
if (containsMakerNote)
{
	BitmapMetadataBlob objMakerNote = metadata.GetQuery(queryMakerNote) as BitmapMetadataBlob;
	// GetQueryで帰ってくるデータはobject型なので、適切な型にキャストする必要がある
	byte[] dataMakerNote = objMakerNote.GetBlobValue();
	// これがMakerNoteのデータ
}