概要
C#(WPF)で、jpg画像の中のEXIF情報を取り出し/書き込みする。
読み書きには、BitmapMetadataクラスのGetQuery/SetQueryを使用する。
書き込み
流れは、下記のようにする。
- new BitmapMetadata("jpg");でjpg用のBitmapMetadataを作成。
- 作成したMetadataに、SetQueryでデータを書き込む。
- データを入れたMetadataを、BitmapFrame、FileStreamを使ってファイルに書き込む。
具体的には、下記のようにする。
// ファイル読みこみ
MemoryStream data = new MemoryStream(File.ReadAllBytes(tb_FileName2.Text));
WriteableBitmap image = new WriteableBitmap(BitmapFrame.Create(data));
data.Close();
// metaデータを準備
var metadata = new BitmapMetadata("jpg");
metadata.SetQuery("/app1/ifd/gps/subifd:{ushort=1}", GPSLatitudeRef);
metadata.SetQuery("/app1/ifd/gps/subifd:{ushort=2}", GPSLatitude);
metadata.SetQuery("/app1/ifd/gps/subifd:{ushort=3}", GPSLongitudeRef);
metadata.SetQuery("/app1/ifd/gps/subifd:{ushort=4}", GPSLongitude);
metadata.SetQuery("/app1/ifd/{ushort=271}", "入れたメーカー名");
metadata.SetQuery("/app1/ifd/{ushort=272}", "いれたモデル名");
// ファイルに書き込み
using (FileStream stream = new FileStream(tb_FileName2.Text, FileMode.Open))
{
var enc = new JpegBitmapEncoder();
var frame = BitmapFrame.Create(image, null, metadata, null);
enc.Frames.Add(frame);
enc.Save(stream);
}
※あるファイルから読み込んだEXIF情報を別のファイルに書き込む想定で作っている。
ので、SetQueryのところで使っている「GPSLatitudeRef」などは、読み込みの回で読み込んだデータを使っている想定。
参照:https://qiita.com/tera1707/items/936041605cfa08aec355
コード
参考
EXIF規格
http://www.cipa.jp/std/documents/j/DC-008-2012_J.pdf
わかりやすいEXIFの規格のイメージ(図がわかりやすい)
http://dsas.blog.klab.org/archives/52123322.html
書き込みのサンプル
http://puni-o.hatenablog.com/entry/2017/12/15/113053
読み込みのサンプル
http://funct.hatenablog.com/entry/20151007/1444231916