画像のExif情報を取得する

C#で画像のExif情報を取得するコードを紹介します。

概要

Exif情報はBitmapクラスの PropertyItems プロパティに格納されています。

プログラム例

UI

下図のUIを準備します。
ファイル名を入力するテキストボックス、ファイルを参照ダイアログを開くボタン、Exif取得実行ボタン、出力用テキストボックスを配置します。
画像のExif情報を取得する:画像1

コード

下記のコードを記述します。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace GetExif
{
  public partial class FormMain : Form
  {
    public FormMain()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) {
        textBox_FileName.Text = openFileDialog1.FileName;
      }
    }

    private void button_GetExif_Click(object sender, EventArgs e)
    {
      string filename = textBox_FileName.Text;
      Bitmap bmp = new Bitmap(filename);

      for (int i = 0; i < bmp.PropertyItems.Length; i++) {
        if (bmp.PropertyItems[i].Type == 2){
          string str = System.Text.Encoding.ASCII.GetString(bmp.PropertyItems[i].Value);
          str = str.Trim(new char[]{'\0'});
          textBox_Output.Text += string.Format("{0:X}:{1:d}:{2:s}\r\n",
            bmp.PropertyItems[i].Id, bmp.PropertyItems[i].Type, str);
        }else{
          textBox_Output.Text += string.Format("{0:X}:{1:d}:{2:d}\r\n",
            bmp.PropertyItems[i].Id, bmp.PropertyItems[i].Type, bmp.PropertyItems[i].Len);
        }
      }

      /*
      //foreachを用いたコード例
      foreach (System.Drawing.Imaging.PropertyItem item in bmp.PropertyItems){
        if (item.Type == 2) {
          string str = Encoding.ASCII.GetString(item.Value);
          str = str.Trim(new char[] { '\0' });
          textBox_Output.Text += string.Format("{0:X}:{1:d}:{2:s}\r\n",item.Id, item.Type, str);
        }
        else {
          textBox_Output.Text += string.Format("{0:X}:{1:d}:{2:d}\r\n",
            item.Id, item.Type, item.Len);
        }
      }
      */
    }
  }
}

解説

BitmapクラスのインスタンスにExifが埋め込まれているJPEGファイルを読み込みます。

  string filename = textBox_FileName.Text;
  Bitmap bmp = new Bitmap(filename);


Exif情報はPropertyItemsに格納されています。forループでExif情報の個数分ループを回します。

for (int i = 0; i < bmp.PropertyItems.Length; i++) {
}

PropertyItemのTypeが2の場合はExif情報が文字列のため、文字列をエンコードします。末尾には"\0"が付加されているため、末尾の"\0"を取り除きます。ExifのID、ExifのType、Exif情報の文字列を出力のテキストボックスに表示します。
PropertyItemのTypeが2以外の場合は文字列ではないため、ExifのID、ExifのType、Exif情報の長さを出力のテキストボックスに表示します。

if (bmp.PropertyItems[i].Type == 2){
  string str = System.Text.Encoding.ASCII.GetString(bmp.PropertyItems[i].Value);
  str = str.Trim(new char[]{'\0'});
  textBox_Output.Text += string.Format("{0:X}:{1:d}:{2:s}\r\n",
  bmp.PropertyItems[i].Id, bmp.PropertyItems[i].Type, str);
}else{
  textBox_Output.Text += string.Format("{0:X}:{1:d}:{2:d}\r\n",
    bmp.PropertyItems[i].Id, bmp.PropertyItems[i].Type, bmp.PropertyItems[i].Len);
}

PropertyItemのTypeの値とValueの形式

Typeの値Valueで表される型
1Valueはバイト型配列
2ValueはNULL終端の文字列、Lenプロパティの長さはNULL終端文字を含んだ長さになる
3Valueは符号なし整数(16ビット)の配列
4Valueは符号なし整数(32ビット)の配列
5Valueは符号なしlongのペア配列、ペア配列により分数を表しており最初の値が分子、2番目の値が分母を表す
6Valueは任意のデータを保持できるバイト型配列
7Valueは符号つき整数(32ビット)の配列
8
9
10Valueは符号つきlongのペア配列、ペア配列により分数を表しており最初の値が分子、2番目の値が分母を表す

実行結果

アプリケーションを実行します。ウィンドウが表示されますので[参照]ボタンを押します。[ファイルを開く]ダイアログが表示されますので、画像を選択します。(下図参照)
画像のExif情報を取得する:画像2

画像を選択するとテキストボックスにファイルのパスが入力されますので、その後[Exif取得]ボタンを押します。Exif情報が出力用テキストボックスに表示されます。
画像のExif情報を取得する:画像3

AuthorPortraitAlt
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
作成日: 2012-04-19
Copyright © 1995–2025 iPentec all rights reserverd.