- PR -

C# 画像ファイルのプロパティ情報(Vista)

1
投稿者投稿内容
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2007-09-24 11:58
WindowsVistaでJPEG画像等をプロパティ参照すると、
詳細タグに下記の追加情報が表示されます。
これらの追加情報をC#から活用する方法を知りたい。

{Vistaで表示される項目}
説明パネルの項目→タイトル、表題、評価、タグ、コメント
元の場所パネルの項目→撮影日、プログラム名、取得日時、著作権

Q1.これらの追加情報は何らかの標準規格に基づいているのですか?
標準規格の定義についての情報源はどこにありますか?
(C#からアクセスする場合に必要となる情報を中心に知りたい)

Q2.C#から上記の項目を取得あるいは設定するにはどうすれば良いですか?

Q3.上記以外のオリジナル項目を新たに定義することはできますか?
例 「絞り量」という項目を定義し、"F8"とか"F16"等の情報を格納する。
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2007-09-24 12:51
Property 情報の保存場所は大きく分けて2種類あります。

  1. Windows で定義されており NTFS alternate data streams に保存されているもの
  2. 対象の file format で定義されておりその file に埋め込まれているもの


で、これを自力で扱うにはそれぞれことなる 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 ]
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 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);
}
}

ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2007-09-24 21:37
DsoFile は基本 Office documents のみ property 情報に書き込みが可能です。

それ以外の file formats に書き込む場合には別の方法でやらないとダメですね。
_________________
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2007-09-24 22:46
こんばんは。

引用:

ひろしさんの書き込み (2007-09-24 11:58) より:

Q1.これらの追加情報は何らかの標準規格に基づいているのですか?
標準規格の定義についての情報源はどこにありますか?
(C#からアクセスする場合に必要となる情報を中心に知りたい)



JPEGの追加情報についてはExifですね。
EXIF.org
デジタルスチルカメラ用画像ファイルフォーマット規格(Exif)Ver 2.1

それ以外の追加情報は、NTFSストリームですね。
OLEドキュメント(複合ドキュメント/構造化記憶)を意識した造りになってますね。

引用:

Q2.C#から上記の項目を取得あるいは設定するにはどうすれば良いですか?



デジカメ画像のExif情報を取得するには?

引用:

Q3.上記以外のオリジナル項目を新たに定義することはできますか?
例 「絞り量」という項目を定義し、"F8"とか"F16"等の情報を格納する。


Exifに(絞り値 ApertureValue)というのがあるようですが。

引用:

ひろしさんの書き込み (2007-09-24 16:05) より:

// ★ ↓ここでハンドルが無効です。エラーが発生します。
summary = ducProperty.SummaryProperties;
// エラーメッセージの詳細
// System.Runtime.InteropServices.COMException はハンドルされませんでした。
// Message="ハンドルが無効です。 (HRESULT からの例外: 0x80070006 (E_HANDLE))"



Dsofileのデモプログラムでも同じエラー(0x80070006)がでますね。
UACを無効にするとエラーがでなくなりますが。
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2007-09-25 19:38
ご回答ありがとうございます。

Exif情報の取得と設定ができました。
ExifのUserCommentタグ(id=37510)が使えそうです。

しかし...
PropertyItemクラスのpublicコンストラクタが無いのが残念です。
自分で作成したBitmapオブジェクトに対しては、デジカメ等で作成した
画像(つまりPropertyItem付きの画像)からPropertyItemを読み込んで
移植しています。

NTFSストリームも、Exifも泥臭いですね。

P.S.
UACは未だ試していません。実験したら報告させていただきます。
1

スキルアップ/キャリアアップ(JOB@IT)