C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

TIFの撮影日時がPropertyIdListで取得できない

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■86272 / inTopicNo.1)  TIFの撮影日時がPropertyIdListで取得できない
  
□投稿者/ なと (1回)-(2018/01/12(Fri) 13:42:54)

分類:[.NET 全般] 

質問内容はC#言うより画像ファイルフォーマットの仕様に関する質問です。
環境はWindows10で、一応C# 2010で開発中です。

フォルダを選択して配下の全ての画像ファイルから
「ファイル名,撮影日時」
を記載したCSVを出力するプログラムを作りました。

ところが一部のtifファイルの撮影日時が読み取れていないことが判明しました。
jpg形式のファイルは問題なく取得出来ている状況です。

撮影日時情報が本当に有るかどうか・・・は、
エクスプローラ上でプロパティして「詳細」タブの中に記述があるので間違いないと考えています。
諸事情によりサンプルデータを提示することが出来ないので表示されている情報を出します。
※作成日時:2006/7/23
※撮影日時:2006/4/2
※EXIFバージョン:0221
※プログラム名:FUJIFILM RAW FILECONVERTER LE Ver.4

読み込みコード(極めて一般的なものです)
using (System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(path))
{
foreach (var item in bmp.PropertyItems)
{
if (item.Id == 0x9003 && item.Type == 2)
{
//処理
}
}
}

PropertyItemsには18件アイテムがありましたが「0x9003」は含まれていませんでした。

何かご存知のことがあれば教えていただけないでしょうか。

※最悪「ファイル名,撮影日時」のCSVさえ作ることができれば良いので、
同等のことが出来るフリーソフトを提案頂けるだけでも助かります。
引用返信 編集キー/
■86273 / inTopicNo.2)  Re[1]: TIFの撮影日時がPropertyIdListで取得できない
□投稿者/ なと (2回)-(2018/01/12(Fri) 13:59:51)
バイナリを読んでみました。
0x00000000から
4D 4D 00 2A 00 00 05 46 46 55 4A 49 46 49 4C 4D
00 00 46 69 6E 65 50 69 78 20 53 33 50 72 6F 20
20 00 00 00 00 48 00 00 00 01 00 00 00 48 00 00
00 01 46 55 4A 49 46 49 4C 4D 20 52 41 57 20 46
49 4C 45 20 43 4F 4E 56 45 52 54 45 52 20 4C 45
20 56 65 72 2E 34 00 00 32 30 30 36 3A 30 37 3A
32 33 20 31 36 3A 32 37 3A 31 37 00 20 20 20 20
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
しばらく20が続く

0x00000260から
20 20 20 20 20 20 20 20 20 20 20 00 00 00 00 0A
00 00 07 08 00 00 02 9E 00 00 00 64 32 30 30 36 ←←←←32〜目的の撮影日時が開始
3A 30 34 3A 30 32 20 31 36 3A 32 35 3A 31 33 00 ←←33まで2006:04:02 16:25:13
32 30 30 36 3A 30 34 3A 30 32 20 31 36 3A 32 35
3A 31 33 00 00 00 02 EE 00 00 00 64 00 00 02 26

最悪バイナリで自力で読むか・・でしょうか。
引用返信 編集キー/
■86274 / inTopicNo.3)  Re[2]: TIFの撮影日時がPropertyIdListで取得できない
□投稿者/ Hongliang (594回)-(2018/01/12(Fri) 15:25:07)
カメラは持ってないので、Win7 SP1で適当なpngファイルをMS Paintでtiffに保存しなおし、
Explorerを使ってプロパティ>詳細から撮影日時を設定して、ファイルを観察しました。

タグID 0x9003は存在していますが、これはTIFFタグとして存在しているのではなく、
TIFFタグ 0x8769 <Exif IFD> の子要素として存在しています。
GDI+ではExif IFDは無視されるみたいですね。
また、XMPパケットとしても撮影日時が格納されていました。
これはタグID 0x02BC <XMP> の内部に、XMLの形式で入っていますが、
これもGDI+では無視されるタグのようです。

System.Drawing/GDI+を使って解析する限りはどうにもならないんじゃないかなぁ、
という印象ですね。

主にWPFにて使用される画像コンポーネントであるSystem.Windows.Media.Imaging/WICを
使用すれば、これらのタグも取得できるのを確認しました。

var dec = BitmapDecoder.Create(...);
var frame = dec.Frames[0];
var meta = (BitmapMetadata)frame.Metadata;
var date1 = meta.GetQuery("/ifd/{ushort=34665}/{ushort=36867}");
var date2 = meta.GetQuery("/ifd/{ushort=700}/xmp:CreateDate");

// BitmapMetadataでのタグのたどり方
static void ShowMeta(BitmapMetadata meta, int depth) {
  foreach (var id in meta) {
    var value = meta.GetQuery(id);
    var child = value as BitmapMetadata;
    var indent = new String(' ', depth * 2);
    if (child == null) {
      Debug.Print("{0}{1}={2}", indent, id, value);
    }
    else {
      Debug.Print("{0}{1}:", indent, id);
      ShowMeta(child, depth + 1);
    }
  }
}

引用返信 編集キー/
■86275 / inTopicNo.4)  Re[2]: TIFの撮影日時がPropertyIdListで取得できない
□投稿者/ みい (79回)-(2018/01/12(Fri) 15:33:41)
No86273 (なと さん) に返信

> 00 00 07 08 00 00 02 9E 00 00 00 64 32 30 30 36 ←←←←32〜目的の撮影日時が開始
> 3A 30 34 3A 30 32 20 31 36 3A 32 35 3A 31 33 00 ←←33まで2006:04:02 16:25:13

もしかするとID=306(0x132)のファイル変更日時かも。

http://www2.airnet.ne.jp/~kenshi/exif.html#EXIF

if (item.Id == 0x132 && item.Type == 2)
で試してみてください。

> item.Id == 0x9003
EXIF固有タグになるのでTIFFには含まれていないのではないか
と思われます。

引用返信 編集キー/
■86276 / inTopicNo.5)  Re[3]: TIFの撮影日時がPropertyIdListで取得できない
□投稿者/ なと (3回)-(2018/01/12(Fri) 16:41:14)
No86274 (Hongliang さん) に返信
ありがとうございます。
しかしながら私の環境では下記のアセンブリが参照マネージャーに出てきませんでした。
> 主にWPFにて使用される画像コンポーネントであるSystem.Windows.Media.Imaging/WICを

何らかのランタイムのインストールが必要なのでしょうか
※Micosoft Visual C# 2010 Expressまたは、Visual Studio Professional 2017が利用可能です。


■みい 様
> もしかするとID=306(0x132)のファイル変更日時かも。
ID=306はPropertyIdListから取得できることは確認できました。
しかしこれは撮影日時とは別物で、バイナリエディタで見ると結構先に進んだところに書き込まれていました。
日付が作成日時と同一なのでRAWからTIFに現像した時の日時かと思われます。
引用返信 編集キー/
■86277 / inTopicNo.6)  Re[4]: TIFの撮影日時がPropertyIdListで取得できない
□投稿者/ zakzak (1回)-(2018/01/12(Fri) 16:50:25)
System.Windows.Media.Imagingは、PresentationCore.dllに含まれます。
引用返信 編集キー/
■86278 / inTopicNo.7)  Re[4]: TIFの撮影日時がPropertyIdListで取得できない
□投稿者/ Hongliang (595回)-(2018/01/12(Fri) 16:55:01)
> しかしながら私の環境では下記のアセンブリが参照マネージャーに出てきませんでした。
>>主にWPFにて使用される画像コンポーネントであるSystem.Windows.Media.Imaging/WICを

あ、これは名前空間です。
アセンブリはPresentationCore.dllになります。
WindowsBase.dllも必要。
System.Xaml.dllは画像コンポーネントだけなら不要かな?
引用返信 編集キー/
■86282 / inTopicNo.8)  Re[5]: TIFの撮影日時がPropertyIdListで取得できない
□投稿者/ なと (4回)-(2018/01/12(Fri) 20:14:46)
Hongliang様、本当にありがとうございます!

こちらの構文にて無事撮影日時を取得することができるようになりました。
> var date1 = meta.GetQuery("/ifd/{ushort=34665}/{ushort=36867}");

結局DLLは3つとも必要になりました。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ