C#で画像のExif情報を取得するコードを紹介します。
Exif情報はBitmapクラスの PropertyItems プロパティに格納されています。
下図のUIを準備します。
ファイル名を入力するテキストボックス、ファイルを参照ダイアログを開くボタン、Exif取得実行ボタン、出力用テキストボックスを配置します。
下記のコードを記述します。
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);
}
Typeの値 | Valueで表される型 |
---|---|
1 | Valueはバイト型配列 |
2 | ValueはNULL終端の文字列、Lenプロパティの長さはNULL終端文字を含んだ長さになる |
3 | Valueは符号なし整数(16ビット)の配列 |
4 | Valueは符号なし整数(32ビット)の配列 |
5 | Valueは符号なしlongのペア配列、ペア配列により分数を表しており最初の値が分子、2番目の値が分母を表す |
6 | Valueは任意のデータを保持できるバイト型配列 |
7 | Valueは符号つき整数(32ビット)の配列 |
8 | |
9 | |
10 | Valueは符号つきlongのペア配列、ペア配列により分数を表しており最初の値が分子、2番目の値が分母を表す |
アプリケーションを実行します。ウィンドウが表示されますので[参照]ボタンを押します。[ファイルを開く]ダイアログが表示されますので、画像を選択します。(下図参照)
画像を選択するとテキストボックスにファイルのパスが入力されますので、その後[Exif取得]ボタンを押します。Exif情報が出力用テキストボックスに表示されます。