C#のformアプリでexifを読みます。
"rational"の記載のあるものについては XX/YY というような表記をするようで、WORD1/WORD2 のようにすればよいようです。
以下は参照ボタンでOpenFileDialogにてパスを指定取得し、ボタンを押下することで街頭パスのExif情報をTextBoxに表示する例となります。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing.Imaging; // PropertyItems用
namespace ExifReader
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
// ボタンを押下するとOpenFileDialogによりファイルパスを取得する
private void button1_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
textBox_FileName.Text = openFileDialog1.FileName;
}
}
// 表示ボタン押下でtextboxにExif情報を読んだ結果を表示する
private void button2_Click(object sender, EventArgs e)
{
string filename = textBox_FileName.Text;
Bitmap bmp = new Bitmap(filename); // Exifのついたファイルを読み込む
textBox_Output.Text = "";
// 列挙してみる
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);
}
}
// indexを使って直接取得してみる
// ISOSpeedRatings
int[] pils = bmp.PropertyIdList;
int index = Array.IndexOf(pils, 0x8827);
if(index > 0)
{
PropertyItem pi = bmp.PropertyItems[index];
int iso = BitConverter.ToUInt16(pi.Value, 0);
textBox_Output.Text += string.Format("iso: {0:d}\r\n", iso); // iso: 100 と表示された
}
// https://msdn.microsoft.com/ja-jp/library/system.drawing.imaging.propertyitem.id(v=vs.110).aspx
// FNumber
index = Array.IndexOf(pils, 0x829d);
if (index > 0)
{
PropertyItem pi = bmp.PropertyItems[index];
// "rational"の解析は以下のようにする
uint fn1 = BitConverter.ToUInt32(pi.Value, 0);
uint fn2 = BitConverter.ToUInt32(pi.Value, 4);
textBox_Output.Text += string.Format("Fnumber: {0:d}/{1:d}\r\n", fn1, fn2); // Fnumber: 56/10
}
// ExposureTime
index = Array.IndexOf(pils, 0x829a);
if (index > 0)
{
PropertyItem pi = bmp.PropertyItems[index];
uint exp1 = BitConverter.ToUInt32(pi.Value, 0);
uint exp2 = BitConverter.ToUInt32(pi.Value, 4);
textBox_Output.Text += string.Format("ExposureTime: {0:d}/{1:d}\r\n", exp1, exp2); // exposuretime: 10/2000
}
// ExposureBiasValue
index = Array.IndexOf(pils, 0x9204);
if (index > 0)
{
PropertyItem pi = bmp.PropertyItems[index];
int exp1 = BitConverter.ToInt32(pi.Value, 0);
int exp2 = BitConverter.ToInt32(pi.Value, 4);
textBox_Output.Text += string.Format("ExposureBiasValue: {0:d}/{1:d}\r\n", exp1, exp2); // ExposureBiasValue: 4/6
}
}
}
}
0 件のコメント:
コメントを投稿