|
.NET TIPS デジカメ画像のExif情報を取得するには?デジタルアドバンテージ2003/07/04 |
![]() |
|
|
|
現在、ほとんどのデジタル・カメラ(以下デジカメ)は、撮影した画像をExif(EXchangeable Image File)という形式のファイルとして保存する。Exifフォーマットの画像ファイルは、画像フォーマットの1つであるJPEGフォーマットに、撮影したデジカメの情報(メーカーやモデル)や、撮影日時、撮影時の条件(露光時間、フラッシュのON/OFFなど)などのさまざまな付加情報を含めたものだ(ファイルの拡張子は「.jpg」。無圧縮の場合はTIFFフォーマットの場合もある)。
Windowsの描画エンジンであるGDI+は、このExifフォーマットに対応しており、GDI+をベースとしている.NET Frameworkクラス・ライブラリの画像関連クラスにおいても、比較的簡単にExifフォーマットの画像ファイルから、それに埋め込まれた付加情報を取得することができる。
Exif付加情報の構造について簡単に解説しておくと、付加情報内の個々のデータは次の形式で記述されている。
- タグ(項目を識別する2bytesの番号)
- タイプ(データの型。1:8bit符号なし整数、2:ASCII文字(7bit)の文字列、3:16bit符号なし整数、4:32bit符号なし整数など)
- カウント(データのサイズ)
- データへのオフセット
- 実際のデータ
Exif付加情報についての詳細は、その規格書を参照していただきたい。Exifフォーマットの最新バージョンは2.2のようだが、GDI+が準拠しているバージョンはExif 2.1のようだ。
タグ番号とタイプについては、取得したいデータのものを規格書であらかじめ調べておく必要がある。例えば、デジカメのメーカーについては、タグ番号が「0x010f」で、タイプは「文字列」である。
PropertyItemsプロパティとPropertyIdListプロパティ
さて、.NET Frameworkクラス・ライブラリではまず、Exif付加情報内の各データ(画像ファイルの「メタデータ」と呼ばれる)は、PropertyItemクラス(System.Drawing.Imaging名前空間)で表される。このクラスの持つ4つのプロパティは次のようにExif付加情報に対応している。
- Id(タグ番号に対応)
- Type(タイプに対応)
- Len(カウントに対応)
- Value(実際のデータ)
そして、このPropertyItemオブジェクトは、画像ファイルを読み込んだBitmapクラス(System.Drawing名前空間)のインスタンスから、PropertyItemsプロパティにより配列として取得することができる。この処理をコードで示すと次のようになる。
Bitmap bitmap = new Bitmap("mypicture.jpg");
PropertyItem[] pis = bitmap.PropertyItems;
画像の読み込みに関しては、「TIPS:画像を読み込むには?」を参照していただきたい。
上記のコードにより、画像ファイルに含まれている付加情報の各データはすべて列挙できるが、このままでは配列内にあるそれぞれの要素のIdプロパティをいちいちチェックしないと、必要なデータにたどりつけない。このためBitmapクラスには、Id(タグ番号)のみをint型の配列で返すPropertyIdListプロパティも用意されている。これを利用すれば、次のようにして特定のタグ番号のデータを取得することができる。
Bitmap bitmap = new Bitmap("mypicture.jpg");
int[] pils = bitmap.PropertyIdList;
int index = Array.IndexOf(pils, 0x010f);
PropertyItem pi = bitmap.PropertyItems[index];
string maker = Encoding.ASCII.GetString(pi.Value);
Arrayクラス(System名前空間)のIndexOfメソッドは、指定した配列から、指定した値を持つ要素のインデックス番号を返す(見つからなかった場合は-1)。また、最後の行ではEncodingクラス(System.Text名前空間)のGetStringメソッドにより、デジカメのメーカー名を含んだバイト配列を文字列として取得している。
次のコード例は同様にして、デジカメ画像から撮影時に使用されたISO感度(タグ番号は0x8827)を整数値として取り出す。
Bitmap bitmap = new Bitmap("mypicture.jpg");
int[] pils = bitmap.PropertyIdList;
int index = Array.IndexOf(pils, 0x8827);
PropertyItem pi = bitmap.PropertyItems[index];
int iso = BitConverter.ToUInt16(pi.Value, 0);
ISO感度については、タイプ(Type)が「3:16bit符号なし整数」であるため、BitConverterクラス(System名前空間)のToUInt16メソッドにより、2bytesの値を整数に変換する必要がある。これについては「TIPS:バイト列と数値を変換するには?」を参照していただきたい。エンディアンについては、多くのデジカメ画像で問題はなさそうだ。
ファイル名を撮影日付にリネーム
最後に、Exifファイルから撮影日時を取り出し、画像ファイルのファイル名をその撮影日時で置き換えるほんの少し実用的なサンプル・プログラムを示しておこう。このプログラムはコマンドラインのパラメータで指定されたデジカメ画像のファイルを、「YYYY-MM-SS_HH-MM-SS.jpg」という形式のファイル名に変更する(例:「2002-12-31_23-59-59.jpg」)。
|
|
| ファイル名を撮影日付にリネームするC#のサンプル・プログラム(exifname.cs) | |
撮影日時のタグ番号は「0x9003」であり、「YYYY:MM:DD HH:MM:SS」の形式で文字列として記録されている。ただし文字列の最後にはNULL文字が含まれているため、上記のプログラムでは19文字分だけを正確に切り出している。なお、File.Moveメソッドによるファイル名の変更については「TIPS:ファイルをコピー/削除/リネーム/移動するには?」を参照していただきたい。
より実用的に使えるよう改造して活用していただければ幸いである。
| カテゴリ:クラス・ライブラリ 処理対象:ビットマップ 使用ライブラリ:PropertyItemクラス(System.Drawing.Imaging名前空間) 使用ライブラリ:Bitmapクラス(System.Drawing名前空間) 使用ライブラリ:Arrayクラス(System名前空間) 使用ライブラリ:BitConverterクラス(System名前空間) 関連TIPS:画像を読み込むには? 関連TIPS:バイト列と数値を変換するには? 関連TIPS:ファイルをコピー/削除/リネーム/移動するには? |
|
||||||||||||||||||||||||
| 「.NET TIPS」 |
ホワイトペーパー(TechTargetジャパン)
- いくつかのVS 2010 RCの更新 (2010/3/10)
Visual Studio 2010 RC版のIntelliSenseおよびWebデザイナに関するパッチのリリースと、そのほかの問題点についてのお知らせ - C#ラムダ式 基礎文法最速マスター (2010/3/9)
ラムダ式(C#)の基礎文法を、短い説明と簡単なコードで簡潔にまとめる。「ラムダ式、どう書くんだっけ?」という場合の簡易リファレンスとして活用できる - ASP.NET MVC:AJAXによる地図表示/単体テスト (2010/3/8)
ASP.NET MVCを使った、小さいながらも完全なWebアプリケーションの構築手順を最初から最後まで解説。最終部分となるステップ10〜12を公開 - Webアプリ改造の前に「速習! jQuery/jQuery UI」 (2010/3/5)
わずか数行のコードでアニメーションなどのエフェクトをWebアプリに組み込むことができるjQuery。改造前にそのポイントを理解
|
|
スキルアップ/キャリアアップ(JOB@IT)
スポンサーからのお知らせ
- - PR -
| 仮想環境の構築とデータ保護の特効薬?! 実績と信頼性の高いパッケージで安心運用 New! |
| 仮想環境のバックアップもこれまでどおり 「まるごと取ってまるごと戻す」簡単運用 |
| おばかアプリ選手権、第4弾開催中!! ムダにカッコよくてくだらない作品求ム! |
| 社内ファイルサーバを“クラウド”に統合 VPN直結「クラウド型ストレージ」を紹介 |
| その数、なんと400台以上! グループ内 サーバの「統合管理」によるメリットは? |
| 美人!? まあまあ? 気になる いやし系!! PV急増で「美人時計」がとった手段とは? |
| .NET編集長が実践する「技術情報検索術」 サンプル・コードを簡単に探す“技”は? |
| 進化を続ける富士通ストレージETERNUS DX 製品開発者の自信を裏付けるものとは何か |
| 運用管理の課題を“2つの観点”から分析 ユーザー満足度の高い「仮想環境」とは? |
- - PR -
お勧め求人情報

**先週の人気講座ランキング**
〜Java編〜
| ◆ | おばかアプリ選手権、第4弾開催中!! ムダにカッコよくてくだらない作品求ム! |
| ◆ | 社内ファイルサーバを“クラウド”に統合 VPN直結「クラウド型ストレージ」を紹介 |
| ◆ | Twitterのアカウントはなぜ突破された? メールによる新手の攻撃手法とその対策 |

| ◆ | もう仮想化のお試しフェイズは終わりだ! Hyper-V 2.0が基幹システムも仮想化 |
| ◆ | 美人!? まあまあ? 気になる いやし系!! PV急増で「美人時計」がとった手段とは? |
| ◆ | クライアント企業から求められる人材 ⇒IT技術と経営戦略を併せ持つ「戦略家」 |

| ◆ | .NET編集長が実践する「技術情報検索術」 サンプル・コードを簡単に探す“技”は? |
| ◆ | 業務効率と情報セキュリティ対策を両立! 手間なく確実に機密情報を守る方法とは? |
| ◆ | 直属上司が海外にいるのエンジニアに見る 【実例】場所に捉われないワークスタイル |

| ◆ | 「仮想化工房」のマイスターが選んだのは VMware、Hyper-V、そしてVirtageだった! |
| ◆ | 進化を続ける富士通ストレージETERNUS DX 製品開発者の自信を裏付けるものとは何か |
| ◆ | 運用管理の課題を“2つの観点”から分析 ユーザー満足度の高い「仮想環境」とは? |

| ◆ | 【CTC事例】約30の基幹システムを統合! 膨大なバッジジョブを制御した方法は? |







