LoginSignup
4
3

More than 5 years have passed since last update.

【WPF】C#でjpgのExif情報を書き込む

Last updated at Posted at 2019-03-11

概要

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

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3