- - PR -
C# 画像ファイルのプロパティ情報(Vista)
1
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-09-24 11:58
WindowsVistaでJPEG画像等をプロパティ参照すると、
詳細タグに下記の追加情報が表示されます。 これらの追加情報をC#から活用する方法を知りたい。 {Vistaで表示される項目} 説明パネルの項目→タイトル、表題、評価、タグ、コメント 元の場所パネルの項目→撮影日、プログラム名、取得日時、著作権 Q1.これらの追加情報は何らかの標準規格に基づいているのですか? 標準規格の定義についての情報源はどこにありますか? (C#からアクセスする場合に必要となる情報を中心に知りたい) Q2.C#から上記の項目を取得あるいは設定するにはどうすれば良いですか? Q3.上記以外のオリジナル項目を新たに定義することはできますか? 例 「絞り量」という項目を定義し、"F8"とか"F16"等の情報を格納する。 | ||||||||||||||||
|
投稿日時: 2007-09-24 12:51
Property 情報の保存場所は大きく分けて2種類あります。
で、これを自力で扱うにはそれぞれことなる file format の数だけ対応させる必要があるのですが、Windows は一応それを一元的に扱う API を持っています。 Vista より前だと IPropertyStorage, IPropertySetStorage を使って読み書きします。 Properties and Property Sets Vista 以降ではここら辺が拡張されているので、 IPropertyStore が使えるかも。 Property System ともに IDispatch を実装していない COM ですので、C# からですと P/Invoke してやるか、C++ CLI で wrapper 作ってそれ経由で呼び出してやるとかする必要があると思います。 URL 修正 _________________ ちゃっぴ@わんくま同盟 ちゃっぴの監禁部屋 [ メッセージ編集済み 編集者: ちゃっぴ 編集日時 2007-09-24 12:58 ] | ||||||||||||||||
|
投稿日時: 2007-09-24 16:05
ご回答ありがとうございます。
DsoFileを使う方法を見つけました。 IPropertyStorage, IPropertySetStorageよりも簡単そうだったので、 早速COMをインストールし、下記サイトのサンプルを参考に試してみました。 ところが、★印の行で、"ハンドルが無効です。"エラーが発生します。 エラーの原因を教えてください。 NTFSのストリームにアクセスする方法 http://ant0x.udap.jp/tips/tips_fileSummaryInfo.htm DsoFileCOMコンポーネント http://support.microsoft.com/kb/224351/ja // 以下、ソースコード private void button1_Click(object sender, EventArgs e) { // 環境 WindowsVista // KB224351をインストールします。 // http://support.microsoft.com/kb/224351/ja // 参照設定にCOMへの参照(DSOFile)を追加します。 // Cドライブ(NTFS)にc:\data\test.jpgファイルを作成します。 DSOFile.OleDocumentPropertiesClass ducProperty = new DSOFile.OleDocumentPropertiesClass(); DSOFile.SummaryProperties summary; // 書き込みのテスト try { ducProperty.Open(@"C:\data\test.jpg", false, DSOFile.dsoFileOpenOptions.dsoOptionDefault); // ★ ↓ここでハンドルが無効です。エラーが発生します。 summary = ducProperty.SummaryProperties; // エラーメッセージの詳細 // System.Runtime.InteropServices.COMException はハンドルされませんでした。 // Message="ハンドルが無効です。 (HRESULT からの例外: 0x80070006 (E_HANDLE))" // Source="Dsofile.dll" // ErrorCode=-2147024890 // StackTrace: // 場所 DSOFile.OleDocumentPropertiesClass.get_SummaryProperties() // 場所 WindowsApplication3.Form1.button1_Click(Object sender, EventArgs e) // 場所 C:\Users\hiroshi\Documents\Visual Studio 2005\Projects\WindowsApplication3\WindowsApplication3\Form1.cs:行 35 // ... summary.Title = "タイトル1"; summary.Subject = "サブジェクト1"; summary.Author = "作者1"; summary.Keywords = "キーワード1"; summary.Comments = "コメント1"; summary.Category = "分類1"; } finally { ducProperty.Close(true); } } | ||||||||||||||||
|
投稿日時: 2007-09-24 21:37
DsoFile は基本 Office documents のみ property 情報に書き込みが可能です。
それ以外の file formats に書き込む場合には別の方法でやらないとダメですね。 _________________ | ||||||||||||||||
|
投稿日時: 2007-09-24 22:46
こんばんは。
JPEGの追加情報についてはExifですね。 EXIF.org デジタルスチルカメラ用画像ファイルフォーマット規格(Exif)Ver 2.1 それ以外の追加情報は、NTFSストリームですね。 OLEドキュメント(複合ドキュメント/構造化記憶)を意識した造りになってますね。
デジカメ画像のExif情報を取得するには?
Exifに(絞り値 ApertureValue)というのがあるようですが。
Dsofileのデモプログラムでも同じエラー(0x80070006)がでますね。 UACを無効にするとエラーがでなくなりますが。 | ||||||||||||||||
|
投稿日時: 2007-09-25 19:38
ご回答ありがとうございます。
Exif情報の取得と設定ができました。 ExifのUserCommentタグ(id=37510)が使えそうです。 しかし... PropertyItemクラスのpublicコンストラクタが無いのが残念です。 自分で作成したBitmapオブジェクトに対しては、デジカメ等で作成した 画像(つまりPropertyItem付きの画像)からPropertyItemを読み込んで 移植しています。 NTFSストリームも、Exifも泥臭いですね。 P.S. UACは未だ試していません。実験したら報告させていただきます。 |
1