对于数码相机所拍摄出的图片,Exif信息非常重要.参考网上的文章,结合我的实际需求,整理了一下,一共三个类文件EXIFextractor .cs,Translation.cs,EXIFMetaData,cs (Translation.cs,EXIFMetaData,cs 参看用C#读取图片的EXIF信息2)
///EXIFextractor .cs
using System;
using System.Text;
using System.Collections;
using System.Drawing.Imaging;
using System.Reflection;
using System.IO;
namespace EXIF
{
/// <summary>
/// EXIFextractor Class
/// </summary>
public class EXIFextractor : IEnumerable
{
/// <summary>
/// Get the individual property value by supplying property name
/// </summary>
public object this[string index]
{
get
{
return propertiesHash[index];
}
}
private System.Drawing.Bitmap bmp;
private string data; //全てのEXIF名と値(項目間に/nで隔てる)
private Translation myHash; // EXIFタグと名のHashTable
private Hashtable propertiesHash;// EXIFタグと値のHashTable
internal int Count
{
get
{
return this.propertiesHash.Count;
}
}
//
string separateString;
/// <summary>
///
/// </summary>
public void setTag(int id, string data)
{
Encoding ascii = Encoding.ASCII;
this.setTag(id, data.Length, 0x2, ascii.GetBytes(data));
}
/// <summary>
/// setTag
/// </summary>
public void setTag(int id, int len, short type, byte[] data)
{
PropertyItem item = CreatePropertyItem(type, id, len, data);
this.bmp.SetPropertyItem(item);
buildDB(this.bmp.PropertyItems);
}
/// <summary>
///
/// </summary>
private static PropertyItem CreatePropertyItem(short type, int tag, int len, byte[] value)
{
PropertyItem item;
// Loads a PropertyItem from a Jpeg image stored in the assembly as a resource.
Assembly assembly = Assembly.GetExecutingAssembly();
Stream emptyBitmapStream = assembly.GetManifestResourceStream("EXIFextractor.decoy.jpg");
System.Drawing.Image empty = System.Drawing.Image.FromStream(emptyBitmapStream);
item = empty.PropertyItems[0];
// Copies the data to the property item.
item.Type = type;
item.Len = len;
item.Id = tag;
item.Value = new byte[value.Length];
value.CopyTo(item.Value, 0);
return item;
}
/// <summary>
///
/// </summary>
public EXIFextractor(ref System.Drawing.Bitmap bmp, string separate)
{
propertiesHash = new Hashtable();
this.bmp = bmp;
this.separateString = separate;
myHash = new Translation();
buildDB(this.bmp.PropertyItems);
}
string msp = "";
public EXIFextractor(ref System.Drawing.Bitmap bmp, string separate, string msp)
{
propertiesHash = new Hashtable();
this.separateString = separate;
this.msp = msp;
this.bmp = bmp;
myHash = new Translation();
this.buildDB(bmp.PropertyItems);
}
public static PropertyItem[] GetExifProperties(string fileName)
{
FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
System.Drawing.Image image = System.Drawing.Image.FromStream(stream,
/* useEmbeddedColorManagement = */ true,
/* validateImageData = */ false);
return image.PropertyItems;
}
public EXIFextractor(string file, string separate, string msp)
{
propertiesHash = new Hashtable();
this.separateString = separate;
this.msp = msp;
myHash = new Translation()
this.buildDB(GetExifProperties(file));
}
/// <summary>
/// データタイプによって、値を取得する。
/// </summary>
private void buildDB(System.Drawing.Imaging.PropertyItem[] parr)
{
propertiesHash.Clear();
//全てのEXIF名と値(項目間に/nで隔てる)
data = "";
//ASCII Encoding
Encoding ascii = Encoding.ASCII;
//メタデータプロパティ
foreach (System.Drawing.Imaging.PropertyItem item in parr)
{
string itemValue = "";
string itemName = (string)myHash[item.Id];
// tag not found. skip it
if (itemName == null) continue;
data += itemName + ": ";
//1 = BYTE An 8-bit unsigned integer.,
if (item.Type == 0x1)
{
itemValue = item.Value[0].ToString();
}
//2 = ASCII An 8-bit byte containing one 7-bit ASCII code. The final byte is terminated with NULL.,
else if (item.Type == 0x2)// string
{
itemValue = ascii.GetString(item.Value).Trim('/0');
}
//3 = SHORT A 16-bit (2 -byte) unsigned integer,
else if (item.Type == 0x3)
{ // lookup table
switch (item.Id)
{
case 0x0112: // Orientation 画像の方向
{
switch (convertToInt16U(item.Value))
{
case 1: itemValue = "水平(普通)"; break; //1 = Horizontal (normal)
case 2: itemValue = "水平鏡像"; break; //2 = Mirror horizontal
case 3: itemValue = "回転180"; break; //3 = Rotate 180
case 4: itemValue = "垂直鏡像"; break; //4 = Mirror vertical
case 5: itemValue = "水平鏡像回転270"; break;//5 = Mirror horizontal and rotate 270 CW
case 6: itemValue = "回転90"; break; //6 = Rotate 90 CW
case 7: itemValue = "水平鏡像回転90"; break;//7 = Mirror horizontal and rotate 90 CW
case 8: itemValue = "回転270"; break;//8 = Rotate 270 CW
default: itemValue = "未定義"; break;
}
}
break;
case 0x8827: // ISO
itemValue = "ISO-" + convertToInt16U(item.Value).ToString();
break;
case 0xA217: // センサー方式: SensingMethod
{
switch (convertToInt16U(item.Value))
{
case 1: itemValue = "未定義"; break; //Not defined
case 2: itemValue = "単版カラーセンサー"; break; //One-chip color area sensor
case 3: itemValue = "2板カラーセンサー"; break; //Two-chip color area sensor
case 4: itemValue = "3板カラーセンサー"; break; //Three-chip color area sensor
case 5: itemValue = "色順次カラーセンサー"; break; //Color sequential area sensor
case 7: itemValue = "3線リニアセンサー"; break; //Trilinear sensor
case 8: itemValue = "色順次リニアセンサー"; break; //Color sequential linear sensor
default: itemValue = "保留されます"; break; //reserved
}
}
break;
case 0xA001://ColorSpace
{
if (convertToInt16U(item.Value) == 1)
{
itemValue = "sRGB";
}
else
{
itemValue = "未調整";//Uncalibrated
}
}
break;
case 0x8822: // 露出プログラム: ExposureProgram
switch (convertToInt16U(item.Value))
{
case 0: itemValue = "未定義"; break; // Not defined
case 1: itemValue = "手動"; break; // Manual
case 2: itemValue = "ノーマルプログラム"; break; // Normal program
case 3: itemValue = "露出優先"; break;// Aperture priority
case 4: itemValue = "シャッター優先"; break; // Shutter priority
case 5: itemValue = "creativeプログラム(被写界深度方向にバイアス)"; break; // Creative program (biased toward depth of field)
case 6: itemValue = "actionプログラム(シャッタースピード高速側にバイアス)"; break;// Action program (biased toward fast shutter speed)
case 7: itemValue = "ポートレイトモード(クローズアップ撮影、背景はフォーカス外す)"; break; // Portrait mode (for closeup photos with the background out of focus)
case 8: itemValue = "ランドスケープモード(landscape 撮影、背景はフォーカス合う)"; break; // Landscape mode (for landscape photos with the background in focus)
default: itemValue = "保留されます"; break; // reserved
}
break;
case 0x9207: // 測光方式: MeteringMode
switch (convertToInt16U(item.Value))
{
case 0: itemValue = "不明"; break; // unknown
case 1: itemValue = "平均"; break; //Average
case 2: itemValue = "中央重点"; break; // CenterWeightedAverage
case 3: itemValue = "スポット"; break; // Spot
case 4: itemValue = "マルチスポット"; break; // MultiSpot
case 5: itemValue = "分割測光"; break; // Pattern
case 6: itemValue = "部分測光"; break; // Partial
case 255: itemValue = "その他"; break; // Other
default: itemValue = "保留されます"; break; // reserved
}
break;
case 0x9208: // 光源: LightSource
{
switch (convertToInt16U(item.Value))
{
case 0: itemValue = "不明"; break; //unknown
case 1: itemValue = "昼光"; break; //Daylight
case 2: itemValue = "蛍光灯"; break; //Fluorescent
case 3: itemValue = "タングステン"; break; //Tungsten
case 4: itemValue = "フラッシュ*2.2"; break; //flash*2.2
case 9: itemValue = "晴れ*2.2"; break;
case 10: itemValue = "曇り*2.2"; break;
case 11: itemValue = "日陰*2.2"; break;
case 12: itemValue = "Daylight 蛍光灯(D 5700-7100K)*2.2"; break;
case 13: itemValue = "Day white 蛍光灯(N 4600-5400K)*2.2"; break;
case 14: itemValue = "Cool white 蛍光灯(W 3900-4500K)*2.2"; break;
case 15: itemValue = "White 蛍光灯(WW 3200-3700K)*2.2"; break;
case 17: itemValue = "標準光A"; break; //Standard light A
case 18: itemValue = "標準光 B"; break; //Standard light B
case 19: itemValue = "標準光 C"; break; //Standard light C
case 20: itemValue = "D55"; break;
case 21: itemValue = "D65"; break;
case 22: itemValue = "D75"; break;
case 23: itemValue = "D50*2.2"; break;
case 24: itemValue = "ISOスタジオ?タングステン*2.2"; break;
case 255: itemValue = "その他"; break; //other
default: itemValue = "保留されます"; break; //reserved
}
}
break;
case 0x9209://フラッシュ: Flash
{
switch (convertToInt16U(item.Value))
{
case 0: itemValue = "フラッシュなし"; break; //No Flash
case 1: itemValue = "フラッシュ発光"; break; //Flash fired
case 5: itemValue = "発光したが反射光は検出できなかった"; break; //Fired, Return not detected
case 7: itemValue = "発光したが反射光は検出できなかった"; break; //Fired, Return detected
case 8: itemValue = "オン、非発光"; break; //On, Did not fire
case 9: itemValue = "オン"; break; // On
case 24: itemValue = "自動、非発光"; break;// Auto, Did not fire
case 25: itemValue = "自動、発光"; break;// Auto, Fired
case 32: itemValue = "フラッシュ機能なし"; break;// No flash function
default: itemValue = "未定義"; break; //reserved
}
}
break;
//Exif Version 2.2で新たに規定された項目。
case 0xA401:// スペシャル?エフェクト: CustomRendered
{
switch (convertToInt16U(item.Value))
{
//スペシャル?エフェクト利用の有無。
case 0: itemValue = "ノーマル処理"; break;
case 1: itemValue = "エフェクトあり"; break;
default: itemValue = "未定義"; break; //reserved
}
}
break;
case 0xA402:// 露光モード: ExposureMode
{
switch (convertToInt16U(item.Value))
{
case 0: itemValue = "自動露光"; break;
case 1: itemValue = "手動露光"; break;
case 2: itemValue = "自動ブラケット"; break;
default: itemValue = "未定義"; break; //reserved
}
}
break;
case 0xA403://ホワイト?バランス: WhiteBalance
{
switch (convertToInt16U(item.Value))
{
case 0: itemValue = "自動ホワイト?バランス"; break;
case 1: itemValue = "手動ホワイト?バランス"; break;
default: itemValue = "未定義"; break; //reserved
}
}
break;
case 0xA406://撮影シーン?タイプ: SceneCaptureType
{
switch (convertToInt16U(item.Value))
{
case 0: itemValue = "スタンダード"; break;
case 1: itemValue = "ランドスケープ"; break;
case 2: itemValue = "ポートレイト"; break;
case 3: itemValue = "夜景"; break;
default: itemValue = "未定義"; break; //reserved
}
}
break;
case 0xA408://コントラスト: Contrast
{
switch (convertToInt16U(item.Value))
{
case 0: itemValue = "ノーマル"; break;
case 1: itemValue = "ソフト"; break;
case 2: itemValue = "ハード"; break;
default: itemValue = "未定義"; break; //reserved
}
}
break;
case 0xA409://飽和状態: Saturation
{
switch (convertToInt16U(item.Value))
{
case 0: itemValue = "ノーマル"; break;
case 1: itemValue = "低飽和"; break;
case 2: itemValue = "高飽和"; break;
default: itemValue = "未定義"; break; //reserved
}
}
break;
case 0xA40A://シャープネス: Sharpness
{
switch (convertToInt16U(item.Value))
{
case 0: itemValue = "ノーマル"; break;
case 1: itemValue = "ソフト"; break;
case 2: itemValue = "ハード"; break;
case 3: itemValue = "夜景"; break;
case 4: itemValue = "夜景"; break;
default: itemValue = "未定義"; break; //reserved
}
}
break;
case 0xA40C://被写体撮影モード: SubjectDistanceRange
{
switch (convertToInt16U(item.Value))
{
case 0: itemValue = "不明"; break;
case 1: itemValue = "マクロ"; break;
case 2: itemValue = "近景"; break;
case 3: itemValue = "遠景"; break;
case 4: itemValue = "夜景"; break;
default: itemValue = "未定義"; break; //reserved
}
}
break;
default:
itemValue = convertToInt16U(item.Value).ToString();
break;
}
}
//4 = LONG A 32-bit (4 -byte) unsigned integer,
else if (item.Type == 0x4)
{
itemValue = convertToInt32U(item.Value).ToString();
}
//5 = RATIONAL Two LONGs. The first LONG is the numerator and the second LONG expresses the//denominator.,
else if (item.Type == 0x5)
{
// rational
byte[] n = new byte[item.Len / 2];
byte[] d = new byte[item.Len / 2];
Array.Copy(item.Value, 0, n, 0, item.Len / 2);
Array.Copy(item.Value, item.Len / 2, d, 0, item.Len / 2);
uint a = convertToInt32U(n);
uint b = convertToInt32U(d);
Rational r = new Rational(a, b);
//convert here
switch (item.Id)
{
case 0x9202: // 絞り(APEX) aperture
itemValue = "F" + Math.Round(Math.Pow(Math.Sqrt(2), r.ToDouble()), 2).ToString();
break;
case 0x920A://レンズ焦点距離: FocalLength
itemValue = r.ToDouble().ToString()+" mm";
break;
case 0x829A://露出時間: ExposureTime
itemValue = r.ToString("/") + " 秒";
break;
case 0x829D: // F-number
itemValue = "F/" + r.ToDouble().ToString();
break;
//Exif Version 2.2で新たに規定された項目。
case 0xA407://ゲイン?コントロール: GainControl
{
switch ((int)r.ToDouble())
{
case 0: itemValue = "コントロールなし"; break;
case 1: itemValue = "低ゲイン?アップ"; break;
case 2: itemValue = "高ゲイン?アップ"; break;
case 3: itemValue = "低ゲイン?ダウン"; break;
case 4: itemValue = "高ゲイン?ダウン"; break;
default: itemValue = "未定義"; break; //reserved
}
}
break;
default:
itemValue = r.ToString("/");
break;
}
}
//7 = UNDEFINED An 8-bit byte that can take any value depending on the field definition,
else if (item.Type == 0x7)
{
switch (item.Id)
{
case 0xA300://ファイルソース: FileSource
{
if (item.Value[0] == 3)
{
itemValue = "デジタルカメラ";
}
else
{
itemValue = "保留されます";
}
break;
}
case 0xA301://シーンタイプ: SceneType
if (item.Value[0] == 1)
// a directly photographed image
itemValue = "直接撮影された画像";
else
//Not a directly photographed image
itemValue = "直接撮影された画像ではない";
break;
case 0x9101://各コンポーネントの意味: ComponentsConfiguration
// 0x04050600 : RGB / 0x01020300 : YCbCr
string temp = BitConverter.ToString(item.Value).Substring(0,11);
switch (temp)
{
case "01-02-03-00":
itemValue = "RGB";
break;
case "04-05-06-00":
itemValue = "YCbCr";
break;
default:
itemValue = "未定義";
break;
}
break;
case 0x9286://ユーザーコメント
// ただし始めの8バイトは文字コードを示す。
string usercomment= BitConverter.ToString(item.Value).Substring(0,23);
switch (usercomment)
{
case "41-53-43-49-49-00-00-00":
itemValue = "ASCII";
break;
case "4A-49-53-00-00-00-00-00":
itemValue = "JIS";
break;
case "55-4E-49-43-4F-44-45-00":
itemValue = "Unicode";
break;
default:
itemValue = "未定義";
break;
}
break;
default:
itemValue = "-";
break;
}
}
//9 = SLONG A 32-bit (4 -byte) signed integer (2's complement notation),
else if (item.Type == 0x9)
{
itemValue = convertToInt32(item.Value).ToString();
}
//10 = SRATIONAL Two SLONGs. The first SLONG is the numerator and the second SLONG is the
//denominator.
else if (item.Type == 0xA)
{
// unsigned rational
byte[] n = new byte[item.Len / 2];
byte[] d = new byte[item.Len / 2];
Array.Copy(item.Value, 0, n, 0, item.Len / 2);
Array.Copy(item.Value, item.Len / 2, d, 0, item.Len / 2);
int a = convertToInt32(n);
int b = convertToInt32(d);
Rational r = new Rational(a, b);
// convert here
switch (item.Id)
{
case 0x9201: // シャッタースピード: ShutterSpeedValue
itemValue = "1/" + Math.Round(Math.Pow(2, r.ToDouble()), 2).ToString()+"sec";
break;
case 0x9203://輝度値: BrightnessValue
itemValue = Math.Round(r.ToDouble(), 4).ToString();
break;
default:
itemValue = r.ToString("/");
break;
}
}
// リストに追加する。
if (propertiesHash[itemName] == null)
propertiesHash.Add(itemName, itemValue);
// cat it too
data += itemValue;
data += this.separateString;
}
}
/// <summary>
/// 全ての項目と項目の値(項目間に/nで隔てる)を取得する。
/// </summary>
/// <returns></returns>
public override string ToString()
{
return data;
}
/// <summary>
/// 16-bit (2 -byte) signed short
/// </summary>
int convertToInt16(byte[] arr)
{
if (arr.Length != 2)
return 0;
else
return arr[1] << 8 | arr[0];
}
/// <summary>
/// SHORT:16-bit (2 -byte) unsigned integer
/// </summary>
uint convertToInt16U(byte[] arr)
{
if (arr.Length != 2)
return 0;
else
return Convert.ToUInt16(arr[1] << 8 | arr[0]);
}
/// <summary>
/// SLONG: 32-bit (4 -byte) signed integer (2's complement notation)
/// </summary>
int convertToInt32(byte[] arr)
{
if (arr.Length != 4)
return 0;
else
return arr[3] << 24 | arr[2] << 16 | arr[1] << 8 | arr[0];
}
/// <summary>
/// LONG: 32-bit (4 -byte) unsigned integer
/// </summary>
uint convertToInt32U(byte[] arr)
{
if (arr.Length != 4)
return 0;
else
return Convert.ToUInt32(arr[3] << 24 | arr[2] << 16 | arr[1] << 8 | arr[0]);
}
#region IEnumerable Members
public IEnumerator GetEnumerator()
{
// TODO: Add EXIFextractor.GetEnumerator implementation
return (new EXIFextractorEnumerator(this.propertiesHash));
}
#endregion
}
#region EXIFextractorEnumerator class
/// <summary>
///dont touch this class. its for IEnumerator
/// </summary>
class EXIFextractorEnumerator : IEnumerator
{
Hashtable exifTable;
IDictionaryEnumerator index;
internal EXIFextractorEnumerator(Hashtable exif)
{
this.exifTable = exif;
this.Reset();
index = exif.GetEnumerator();
}
#region IEnumerator Members
public void Reset()
{
this.index = null;
}
public object Current
{
get
{
return (new Pair(this.index.Key, this.index.Value));
}
}
public bool MoveNext()
{
if (index != null && index.MoveNext())
return true;
else
return false;
}
#endregion
}
#endregion
#region Pair class
public class Pair
{
public string First;
public string Second;
public Pair(object key, object value)
{
this.First = key.ToString();
this.Second = value.ToString();
}
}
#endregion
}
http://artemismingr.spaces.live.com/?_c11_BlogPart_pagedir=Next&_c11_BlogPart_handle=cns!69B8ABCD57092B10!1810&_c11_BlogPart_BlogPart=blogview&_c=BlogPart
用C#读取图片的EXIF信息2
///translation.cs
using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
namespace EXIF
{
/// <summary>
/// Summary description for translation.
/// </summary>
public class Translation : Hashtable
{
/// <summary>
///
/// </summary>
public Translation()
{
//IFD0 (main image) で使われているTag
this.Add(0x010e, "ImageDescription");// 画像タイトル
this.Add(0x010f, "Make");// メーカ
this.Add(0x0110, "Model");// モデル
this.Add(0x011a, "XResolution");// 画像の幅方向の解像度(ピクセル)
this.Add(0x011b, "YResolution");// 画像の高さ方向の解像度(ピクセル)
this.Add(0x0128, "ResolutionUnit");// 解像度の単位
this.Add(0x0131, "Software");// 使用したソフトウェア
this.Add(0x0132, "ExifDateTime");// ファイル変更日時
this.Add(0x013f, "PrimaryChromaticities");// 原色の色座標値
this.Add(0x8298, "Copyright");// 著作権表示
this.Add(0x8769, "ExifIFDPointer");// Exif IFD へのポインタ
//Exif SubIFD で使われているTag
this.Add(0x829a, "ExposureTime");// 露出時間(秒)
this.Add(0x829d, "FNumber");// F値
this.Add(0x8822, "ExposureProgram");// 露出プログラム
this.Add(0x8824, "SpectralSensitivity");// スペクトル感度
this.Add(0x8827, "ISOSpeedRatings");// ISOスピードレート
this.Add(0x9000, "ExifVersion");// Exifバージョン
this.Add(0x9003, "DateTimeOriginal");// オリジナル画像の生成日時
this.Add(0x9004, "DateTimeDigitized");// ディジタルデータの生成日時
this.Add(0x9101, "ComponentsConfiguration");// コンポーネントの意味
this.Add(0x9102, "CompressedBitsPerPixel");// 画像圧縮モード(ビット/ピクセル)
this.Add(0x9201, "ShutterSpeedValue");// シャッタースピード(APEX)
this.Add(0x9202, "ApertureValue");// 絞り(APEX)
this.Add(0x9203, "BrightnessValue");//輝度(APEX)
this.Add(0x9204, "ExposureBiasValue");// 露出補正(APEX)
this.Add(0x9205, "MaxApertureValue");// レンズの最小F値(APEX)
this.Add(0x9206, "SubjectDistance");// 被写体距離(m)
this.Add(0x9207, "MeteringMode");//測光方式
this.Add(0x9208, "LightSource");// 光源
this.Add(0x9209, "Flash");// フラッシュ
this.Add(0x920a, "FocalLength");// レンズの焦点距離(mm)
this.Add(0x927c, "MakerNote"); //メーカ固有情報
this.Add(0x9286, "UserComment");// ユーザコメント
this.Add(0x9290, "SubSecTime");//ファイル変更日時の秒以下の値
this.Add(0x9291, "SubSecTimeOriginal");// 画像生成日時の秒以下の値
this.Add(0x9292, "SubSecTimeDigitized");// ディジタルデータ生成日時の秒以下の値
this.Add(0xa000, "FlashPixVersion");// 対応FlashPixのバージョン
this.Add(0xa001, "ColorSpace");// 色空間情報
this.Add(0xa002, "ExifImageWidth ");// メイン画像の幅
this.Add(0xa003, "ExifImageHeight ");// メイン画像の高さ
this.Add(0xa004, "RelatedSoundFile");// 関連音声ファイル名
this.Add(0xa005, "InteroperabilityIFDPointer");// 互換性IFDへのポインタ
this.Add(0xa20e, "FocalPlaneXResolution");// 焦点面の幅方向の解像度(ピクセル)
this.Add(0xa20f, "FocalPlaneYResolution");// 焦点面の高さ方向の解像度(ピクセル)
this.Add(0xa210, "FocalPlaneResolutionUnit");// 焦点面の解像度の単位
this.Add(0xa215, "ExposureIndex");// 露出インデックス
this.Add(0xa217, "SensingMethod");// 画像センサの方式
this.Add(0xa300, "FileSource");// 画像入力機器の種類
this.Add(0xa301, "SceneType");//シーンタイプ
this.Add(0xa302, "CFAPattern");//CFAパターン
//IFD1 (thumbnail image) で使われているTag
this.Add(0x0100, "ImageWidth ");// 画像の幅(ピクセル)
this.Add(0x0101, "ImageHeight ");// 画像の高さ(ピクセル)
this.Add(0x0102, "BitsPerSample");// 画素のビットの深さ(ビット)
this.Add(0x0103, "Compression");// 圧縮の種類
this.Add(0x0106, "PhotometricInterpretation");// 画素構成の種類
this.Add(0x0111, "StripOffsets");// イメージデータへのオフセット
this.Add(0x0112, "Orientation");// 画素の並び
this.Add(0x0115, "SamplesPerPixel");// ピクセル毎のコンポーネント数
this.Add(0x0116, "RowsPerStrip");// 1ストリップあたりの行数
this.Add(0x0117, "StripByteCounts");// 各ストリップのサイズ(バイト)
this.Add(0x011c, "PlanarConfiguration");// 画素データの並び
this.Add(0x0201, "JPEGInterchangeFormat");// JPEGサムネイルのSOIへのオフセット
this.Add(0x0202, "JPEGInterchangeFormatLength");// JPEGサムネイルデータのサイズ(バイト
this.Add(0x0211, "YCbCrCoefficients");// 色変換マトリックス係数
this.Add(0x0212, "YCbCrSubSampling");// 画素の比率構成
this.Add(0x0213, "YCbCrPositioning ");// 色情報のサンプリング
this.Add(0x0214, "ReferenceBlackWhite");// 黒色と白色の値
//その他のTag
this.Add(0x00fe, "NewSubfileType");
this.Add(0x00ff, "SubfileType");
this.Add(0x012d, "TransferFunction");// 諧調カーブ特性
this.Add(0x013b, "Artist");// 撮影者名
this.Add(0x013d, "Predictor");
this.Add(0x013e, "WhitePoint");// ホワイトポイントの色座標値
this.Add(0x0142, "TileWidth");
this.Add(0x0143, "TileLength");
this.Add(0x0144, "TileOffsets");
this.Add(0x0145, "TileByteCounts");
this.Add(0x014a, "SubIFDs");
this.Add(0x015b, "JPEGTables");
this.Add(0x828d, "CFARepeatPatternDim");
this.Add(0x828f, "BatteryLevel ");
this.Add(0x83bb, "IPTC/NAA");
this.Add(0x8773, "InterColorProfile");
this.Add(0x8825, "GPSInfo");// GPS情報IFDへのポインタ
this.Add(0x8828, "OECF");// 光電変換関数
this.Add(0x8829, "Interlace");
this.Add(0x882a, "TimeZoneOffset");
this.Add(0x882b, "SelfTimerMode");
this.Add(0x920b, "FlashEnergy ");// フラッシュのエネルギー(BCPS)
this.Add(0x920c, "SpatialFrequencyResponse");//空間周波数応答
this.Add(0x920d, "Noise");
this.Add(0x9211, "ImageNumber");
this.Add(0x9212, "SecurityClassification");
this.Add(0x9213, "ImageHistory");
this.Add(0x9214, "SubjectLocation");//被写体位置
this.Add(0x9216, "TIFFEPStandardID");
//Interoperability IFD で使われているTag
this.Add(0x0001, "InteroperabilityIndex");
this.Add(0x0002, "InteroperabilityVersion");
this.Add(0x1000, "RelatedImageFileFormat");
}
}
/// <summary>
/// private class
/// RATIONAL Two LONGs. The first LONG is the numerator and the second LONG expresses the denominator.
/// </summary>
internal class Rational
{
private int n;
private int d;
public Rational(int n, int d)
{
this.n = n;
this.d = d;
simplify(ref this.n, ref this.d);
}
public Rational(uint n, uint d)
{
this.n = Convert.ToInt32(n);
this.d = Convert.ToInt32(d);
simplify(ref this.n, ref this.d);
}
public Rational()
{
this.n = this.d = 0;
}
public string ToString(string sp)
{
if (sp == null) sp = "/";
return n.ToString() + sp + d.ToString();
}
public double ToDouble()
{
if (d == 0)
return 0.0;
return Math.Round(Convert.ToDouble(n) / Convert.ToDouble(d), 2);
}
private void simplify(ref int a, ref int b)
{
if (a == 0 || b == 0)
return;
int gcd = euclid(a, b);
a /= gcd;
b /= gcd;
}
private int euclid(int a, int b)
{
if (b == 0)
return a;
else
return euclid(b, a % b);
}
}
}
//
EXIFMetaData.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;
using System.Collections;
using System.ComponentModel;
using System.Reflection;
using System.IO;
using EXIF;
using System.Collections.Specialized;
namespace PictureView
{
class EXIFMetaData
{
public EXIFMetaData()
{
}
#region struct MetadataDetail
/// <summary>
/// 構造体
/// </summary>
public struct MetadataDetail
{
//public string RawValueAsString;//原文字列
public string DisplayValue;//
}
#endregion
#region EXIF Element
/// <summary>
/// EXIF Elementを保存した
/// </summary>
public struct Metadata
{
//IFD0 (main image) で使われているTag
public MetadataDetail ImageDescription;// 画像タイトル
public MetadataDetail Make;// メーカ
public MetadataDetail Model;// モデル
public MetadataDetail XResolution;// 画像の幅方向の解像度(ピクセル)
public MetadataDetail YResolution;// 画像の高さ方向の解像度(ピクセル)
public MetadataDetail ResolutionUnit;// 解像度の単位
public MetadataDetail Software;// 使用したソフトウェア
public MetadataDetail ExifDateTime;// ファイル変更日時
public MetadataDetail PrimaryChromaticities;// 原色の色座標値
public MetadataDetail Copyright;// 著作権表示
public MetadataDetail ExifIFDPointer;// Exif IFD へのポインタ
//Exif SubIFD で使われているTag
public MetadataDetail ExposureTime;// 露出時間(秒)
public MetadataDetail FNumber;// F値
public MetadataDetail ExposureProgram;// 露出プログラム
public MetadataDetail SpectralSensitivity;// スペクトル感度
public MetadataDetail ISOSpeedRatings;// ISOスピードレート
public MetadataDetail ExifVersion;// Exifバージョン
public MetadataDetail DateTimeOriginal;// オリジナル画像の生成日時
public MetadataDetail DateTimeDigitized;// ディジタルデータの生成日時
public MetadataDetail ComponentsConfiguration;// コンポーネントの意味
public MetadataDetail CompressedBitsPerPixel;// 画像圧縮モード(ビット/ピクセル)
public MetadataDetail ShutterSpeedValue;// シャッタースピード(APEX)
public MetadataDetail ApertureValue;// 絞り(APEX)
public MetadataDetail BrightnessValue;//輝度(APEX)
public MetadataDetail ExposureBiasValue;// 露出補正(APEX)
public MetadataDetail MaxApertureValue;// レンズの最小F値(APEX)
public MetadataDetail SubjectDistance;// 被写体距離(m)
public MetadataDetail MeteringMode;//測光方式
public MetadataDetail LightSource;// 光源
public MetadataDetail Flash;// フラッシュ
public MetadataDetail FocalLength;// レンズの焦点距離(mm)
public MetadataDetail MakerNote; //メーカ固有情報
public MetadataDetail UserComment;// ユーザコメント
public MetadataDetail SubSecTime;//ファイル変更日時の秒以下の値
public MetadataDetail SubSecTimeOriginal;// 画像生成日時の秒以下の値
public MetadataDetail SubSecTimeDigitized;// ディジタルデータ生成日時の秒以下の値
public MetadataDetail FlashPixVersion;// 対応FlashPixのバージョン
public MetadataDetail ColorSpace;// 色空間情報
public MetadataDetail ExifImageWidth;// メイン画像の幅
public MetadataDetail ExifImageHeight;// メイン画像の高さ
public MetadataDetail RelatedSoundFile;// 関連音声ファイル名
public MetadataDetail InteroperabilityIFDPointer;// 互換性IFDへのポインタ
public MetadataDetail FocalPlaneXResolution;// 焦点面の幅方向の解像度(ピクセル)
public MetadataDetail FocalPlaneYResolution;// 焦点面の高さ方向の解像度(ピクセル)
public MetadataDetail FocalPlaneResolutionUnit;// 焦点面の解像度の単位
public MetadataDetail ExposureIndex;// 露出インデックス
public MetadataDetail SensingMethod;// 画像センサの方式
public MetadataDetail FileSource;// 画像入力機器の種類
public MetadataDetail SceneType;//シーンタイプ
public MetadataDetail CFAPattern;//CFAパターン
//IFD1 (thumbnail image) で使われているTag
public MetadataDetail ImageWidth;// 画像の幅(ピクセル)
public MetadataDetail ImageHeight;// 画像の高さ(ピクセル)
public MetadataDetail BitsPerSample;// 画素のビットの深さ(ビット)
public MetadataDetail Compression;// 圧縮の種類
public MetadataDetail PhotometricInterpretation;// 画素構成の種類
public MetadataDetail StripOffsets;// イメージデータへのオフセット
public MetadataDetail Orientation;// 画素の並び
public MetadataDetail SamplesPerPixel;// ピクセル毎のコンポーネント数
public MetadataDetail RowsPerStrip;// 1ストリップあたりの行数
public MetadataDetail StripByteCounts;// 各ストリップのサイズ(バイト)
public MetadataDetail PlanarConfiguration;// 画素データの並び
public MetadataDetail JPEGInterchangeFormat;// JPEGサムネイルのSOIへのオフセット
public MetadataDetail JPEGInterchangeFormatLength;// JPEGサムネイルデータのサイズ(バイト
public MetadataDetail YCbCrCoefficients;// 色変換マトリックス係数
public MetadataDetail YCbCrSubSampling;// 画素の比率構成
public MetadataDetail YCbCrPositioning;// 色情報のサンプリング
public MetadataDetail ReferenceBlackWhite;// 黒色と白色の値
//その他
public MetadataDetail NewSubfileType;
public MetadataDetail SubfileType;
public MetadataDetail TransferFunction;// 諧調カーブ特性
public MetadataDetail Artist;// 撮影者名
public MetadataDetail Predictor;
public MetadataDetail WhitePoint;// ホワイトポイントの色座標値 ;
public MetadataDetail TileWidth;
public MetadataDetail TileLength;
public MetadataDetail TileOffsets;
public MetadataDetail TileByteCounts;
public MetadataDetail SubIFDs;
public MetadataDetail JPEGTables;
public MetadataDetail CFARepeatPatternDim;
public MetadataDetail BatteryLevel;
public MetadataDetail IPTCNAA;
public MetadataDetail InterColorProfile;
public MetadataDetail GPSInfo;// GPS情報IFDへのポインタ
public MetadataDetail OECF;// 光電変換関数
public MetadataDetail Interlace;
public MetadataDetail TimeZoneOffset;
public MetadataDetail SelfTimerMode;
public MetadataDetail FlashEnergy;// フラッシュのエネルギー(BCPS)
public MetadataDetail SpatialFrequencyResponse;//空間周波数応答
public MetadataDetail Noise;
public MetadataDetail ImageNumber;
public MetadataDetail SecurityClassification;
public MetadataDetail ImageHistory;
public MetadataDetail SubjectLocation;//被写体位置
public MetadataDetail TIFFEPStandardID;
//Interoperability IFD で使われているTag
public MetadataDetail InteroperabilityIndex;
public MetadataDetail InteroperabilityVersion;
public MetadataDetail RelatedImageFileFormat;
}
#endregion
#region EXIF情報を取得
public Metadata GetEXIFMetaData(string PhotoName)
{
//
Bitmap MyImage = (Bitmap)Bitmap.FromFile(PhotoName);
EXIFextractor exifExtractor = new EXIFextractor(ref MyImage, "/n");
NameValueCollection items = new NameValueCollection();
foreach (Pair pair in exifExtractor)
{
items.Add(pair.First, pair.Second);
}
Metadata MyMetadata = new Metadata();
try
{
MyMetadata.ImageDescription.DisplayValue = items.Get("ImageDescription");// 画像タイトル
MyMetadata.Make.DisplayValue = items.Get("Make");// メーカ
MyMetadata.Model.DisplayValue = items.Get("Model");// モデル
//MyMetadata.XResolution.DisplayValue = items.Get("XResolution");// 画像の幅方向の解像度(ピクセル)
//MyMetadata.YResolution.DisplayValue = items.Get("YResolution");// 画像の高さ方向の解像度(ピクセル)
MyMetadata.XResolution.DisplayValue = MyImage.HorizontalResolution.ToString();
MyMetadata.YResolution.DisplayValue = MyImage.VerticalResolution.ToString();
MyMetadata.ResolutionUnit.DisplayValue = items.Get("ResolutionUnit");// 解像度の単位
MyMetadata.Software.DisplayValue = items.Get("Software");// 使用したソフトウェア
MyMetadata.ExifDateTime.DisplayValue = items.Get("ExifDateTime");// ファイル変更日時
MyMetadata.PrimaryChromaticities.DisplayValue = items.Get("PrimaryChromaticities");// 原色の色座標値
MyMetadata.Copyright.DisplayValue = items.Get("Copyright");// 著作権表示
MyMetadata.ExifIFDPointer.DisplayValue = items.Get("ExifIFDPointer");// Exif IFD へのポインタ
MyMetadata.ExposureTime.DisplayValue = items.Get("ExposureTime");// 露出時間(秒)
MyMetadata.FNumber.DisplayValue = items.Get("FNumber");// F値
MyMetadata.ExposureProgram.DisplayValue = items.Get("ExposureProgram");// 露出プログラム
MyMetadata.SpectralSensitivity.DisplayValue = items.Get("SpectralSensitivity");// スペクトル感度
MyMetadata.ISOSpeedRatings.DisplayValue = items.Get("ISOSpeedRatings");// ISOスピードレート
MyMetadata.ExifVersion.DisplayValue = items.Get("ExifVersion");// Exifバージョン
MyMetadata.DateTimeOriginal.DisplayValue = items.Get("DateTimeOriginal");// オリジナル画像の生成日時
MyMetadata.DateTimeDigitized.DisplayValue = items.Get("DateTimeDigitized");// ディジタルデータの生成日時
MyMetadata.ComponentsConfiguration.DisplayValue = items.Get("ComponentsConfiguration");// コンポーネントの意味
MyMetadata.CompressedBitsPerPixel.DisplayValue = items.Get("CompressedBitsPerPixel");// 画像圧縮モード(ビット/ピクセル)
MyMetadata.ShutterSpeedValue.DisplayValue = items.Get("ShutterSpeedValue");// シャッタースピード(APEX)
MyMetadata.ApertureValue.DisplayValue = items.Get("ApertureValue");// 絞り(APEX)
MyMetadata.BrightnessValue.DisplayValue = items.Get("BrightnessValue");//輝度(APEX)
MyMetadata.ExposureBiasValue.DisplayValue = items.Get("ExposureBiasValue");// 露出補正(APEX)
MyMetadata.MaxApertureValue.DisplayValue = items.Get("MaxApertureValue");// レンズの最小F値(APEX)
MyMetadata.SubjectDistance.DisplayValue = items.Get("SubjectDistance");// 被写体距離(m)
MyMetadata.MeteringMode.DisplayValue = items.Get("MeteringMode");//測光方式
MyMetadata.LightSource.DisplayValue = items.Get("LightSource");// 光源
MyMetadata.Flash.DisplayValue = items.Get("Flash");// フラッシュ
MyMetadata.FocalLength.DisplayValue = items.Get("FocalLength");// レンズの焦点距離(mm)
MyMetadata.MakerNote.DisplayValue = items.Get("MakerNote"); //メーカ固有情報
MyMetadata.UserComment.DisplayValue = items.Get("UserComment");// ユーザコメント
MyMetadata.SubSecTime.DisplayValue = items.Get("SubSecTime");//ファイル変更日時の秒以下の値
MyMetadata.SubSecTimeOriginal.DisplayValue = items.Get("SubSecTimeOriginal");// 画像生成日時の秒以下の値
MyMetadata.SubSecTimeDigitized.DisplayValue = items.Get("SubSecTimeDigitized");// ディジタルデータ生成日時の秒以下の値
MyMetadata.FlashPixVersion.DisplayValue = items.Get("FlashPixVersion");// 対応FlashPixのバージョン
MyMetadata.ColorSpace.DisplayValue = items.Get("ColorSpace");// 色空間情報
MyMetadata.ExifImageWidth.DisplayValue = items.Get("ExifImageWidth ");// メイン画像の幅
MyMetadata.ExifImageHeight.DisplayValue = items.Get("ExifImageHeight ");// メイン画像の高さ
MyMetadata.RelatedSoundFile.DisplayValue = items.Get("RelatedSoundFile");// 関連音声ファイル名
MyMetadata.InteroperabilityIFDPointer.DisplayValue = items.Get("InteroperabilityIFDPointer");// 互換性IFDへのポインタ
MyMetadata.FocalPlaneXResolution.DisplayValue = items.Get("FocalPlaneXResolution");// 焦点面の幅方向の解像度(ピクセル)
MyMetadata.FocalPlaneYResolution.DisplayValue = items.Get("FocalPlaneYResolution");// 焦点面の高さ方向の解像度(ピクセル)
MyMetadata.FocalPlaneResolutionUnit.DisplayValue = items.Get("FocalPlaneResolutionUnit");// 焦点面の解像度の単位
MyMetadata.ExposureIndex.DisplayValue = items.Get("ExposureIndex");// 露出インデックス
MyMetadata.SensingMethod.DisplayValue = items.Get("SensingMethod");// 画像センサの方式
MyMetadata.FileSource.DisplayValue = items.Get("FileSource");// 画像入力機器の種類
MyMetadata.SceneType.DisplayValue = items.Get("シーSceneType");//シーンタイプ
MyMetadata.CFAPattern.DisplayValue = items.Get("CFACFAPattern");//CFAパターン
MyMetadata.ImageWidth.DisplayValue = items.Get("ImageWidth");// 画像の幅(ピクセル)
MyMetadata.ImageHeight.DisplayValue = items.Get("ImageHeight");// 画像の高さ(ピクセル)
MyMetadata.BitsPerSample.DisplayValue = items.Get("BitsPerSample");// 画素のビットの深さ(ビット)
MyMetadata.Compression.DisplayValue = items.Get("Compression");// 圧縮の種類
MyMetadata.PhotometricInterpretation.DisplayValue = items.Get("PhotometricInterpretation");// 画素構成の種類
MyMetadata.StripOffsets.DisplayValue = items.Get("StripOffsets");// イメージデータへのオフセット
MyMetadata.Orientation.DisplayValue = items.Get("Orientation");// 画素の並び
MyMetadata.SamplesPerPixel.DisplayValue = items.Get("SamplesPerPixel");// ピクセル毎のコンポーネント数
MyMetadata.RowsPerStrip.DisplayValue = items.Get("RowsPerStrip");// 1ストリップあたりの行数
MyMetadata.StripByteCounts.DisplayValue = items.Get("StripByteCounts");// 各ストリップのサイズ(バイト)
MyMetadata.PlanarConfiguration.DisplayValue = items.Get("PlanarConfiguration");// 画素データの並び
MyMetadata.JPEGInterchangeFormat.DisplayValue = items.Get("JPEGInterchangeFormat");// JPEGサムネイルのSOIへのオフセット
MyMetadata.JPEGInterchangeFormatLength.DisplayValue = items.Get("JPEGInterchangeFormatLength");// JPEGサムネイルデータのサイズ(バイト
MyMetadata.YCbCrCoefficients.DisplayValue = items.Get("YCbCrCoefficients");// 色変換マトリックス係数
MyMetadata.YCbCrSubSampling.DisplayValue = items.Get("YCbCrSubSampling");// 画素の比率構成
MyMetadata.YCbCrPositioning.DisplayValue = items.Get("YCbCrPositioning ");// 色情報のサンプリング
MyMetadata.ReferenceBlackWhite.DisplayValue = items.Get("ReferenceBlackWhite");// 黒色と白色の値
MyMetadata.NewSubfileType.DisplayValue = items.Get("NewSubfileType");
MyMetadata.SubfileType.DisplayValue = items.Get("SubfileType");
MyMetadata.TransferFunction.DisplayValue = items.Get("TransferFunction");// 諧調カーブ特性
MyMetadata.Artist.DisplayValue = items.Get("Artist");// 撮影者名
MyMetadata.Predictor.DisplayValue = items.Get("Predictor");
MyMetadata.WhitePoint.DisplayValue = items.Get("WhitePoint");// ホワイトポイントの色座標値
MyMetadata.TileWidth.DisplayValue = items.Get("TileWidth");
MyMetadata.TileLength.DisplayValue = items.Get("TileLength");
MyMetadata.TileOffsets.DisplayValue = items.Get("TileOffsets");
MyMetadata.TileByteCounts.DisplayValue = items.Get("TileByteCounts");
MyMetadata.SubIFDs.DisplayValue = items.Get("SubIFDs");
MyMetadata.JPEGTables.DisplayValue = items.Get("JPEGTables");
MyMetadata.CFARepeatPatternDim.DisplayValue = items.Get("CFARepeatPatternDim");
MyMetadata.BatteryLevel.DisplayValue = items.Get("BatteryLevel ");
MyMetadata.IPTCNAA.DisplayValue = items.Get("IPTCNAA");
MyMetadata.InterColorProfile.DisplayValue = items.Get("InterColorProfile");
MyMetadata.GPSInfo.DisplayValue = items.Get("GPSInfo");// GPS情報IFDへのポインタ
MyMetadata.OECF.DisplayValue = items.Get("OECF");// 光電変換関数
MyMetadata.Interlace.DisplayValue = items.Get("Interlace");
MyMetadata.TimeZoneOffset.DisplayValue = items.Get("TimeZoneOffset");
MyMetadata.SelfTimerMode.DisplayValue = items.Get("SelfTimerMode");
MyMetadata.FlashEnergy.DisplayValue = items.Get("FlashEnergy ");// フラッシュのエネルギー(BCPS)
MyMetadata.SpatialFrequencyResponse.DisplayValue = items.Get("SpatialFrequencyResponse");//空間周波数応答
MyMetadata.Noise.DisplayValue = items.Get("Noise ");
MyMetadata.ImageNumber.DisplayValue = items.Get("ImageNumber");
MyMetadata.SecurityClassification.DisplayValue = items.Get("SecurityClassification");
MyMetadata.ImageHistory.DisplayValue = items.Get("ImageHistory");
MyMetadata.SubjectLocation.DisplayValue = items.Get("SubjectLocation");//被写体位置
MyMetadata.TIFFEPStandardID.DisplayValue = items.Get("TIFFEPStandardID");
MyMetadata.InteroperabilityIndex.DisplayValue = items.Get("InteroperabilityIndex");
MyMetadata.InteroperabilityVersion.DisplayValue = items.Get("InteroperabilityVersion");
MyMetadata.RelatedImageFileFormat.DisplayValue = items.Get("RelatedImageFileFormat");
}
catch
{
}
items.Clear();
return MyMetadata;
}
#endregion
}
}