私はPythonスクリプトを書いていて、生の写真ファイル(.CR2など)からexif情報を取得する必要があります。
私は、Python Rawkitがそれを行う機能を提供していることを発見しました。
with Raw(filename=image_path) as raw:
print raw.metadata
Metadata(aperture=-1.2095638073643314e+38, timestamp=4273602232L,
shutter=-1.1962713245823862e+38, flash=True,
focal_length=-1.2228562901462766e+38, height=3753,
iso=-1.182978841800441e+38,
make='Canon', model='EOS 5D Mark II',
orientation=0, width=5634)
しかし、私は少し混乱しています。この値をどのように読むのですか?. たとえば、 100/200/400 のようなiso値を期待していますが、-1.182978841800441e +38とは何ですか?
私の質問はISOに固有のものではなく、シャッター、絞りなどにも当てはまります...
librawとrawkitのドキュメントを確認しましたが、この種の値を読み取ったり変換したりする方法を見つけることができませんでした。
ドキュメントのこの部分はあまり詳しくありません:
float iso_speed;
ISO sensitivity.
float shutter;
Shutter speed.
これらの値の読み方を理解できる人はいますか?
ありがとう
[アップデート]
neo が示唆するように、ExifRead を使用します。実際、それはより良い選択です。私は python スクリプトを書いています。ExifRead を使用すると、追加の C ライブラリ依存関係は必要ありません。
Canon RAW ファイルを開いて Exif を解析することはできましたが、残念ながら絞りの値が正しくありません。
EXIF ApertureValue (Ratio): 3
# My photo was taken in 2.8 (maybe a rounded value on this flag ?)
クイックアンサー: Fnumber フラグを使用する
EXIF FNumber (Ratio): 14/5
14/5 is in fact 2.8 (do the math)
長い答え(私が見つけた/デバッグした方法):
この優れたリンクを読んで、Canon RAW.CR2
ファイルに何が保存されているか、どのように、そしてなぜ(http://lclevy.free.fr/cr2/)私は自分自身を解読し、何が起こっているのかを知ることにしました.
このリンクは、raw ファイルcr2_poster.pdfをデコードするために私をグラールに送ります。それ から、最高の値は、FNumber 値に関する私のキヤノン固有の MakerNote セクションにあるように思われます。(すべての値の説明はここcanon_tags )
Tag Id : 3 (In fact 0x0003 that you write 0x3)
Name : FNumber
ファイルを Hexa エディター (hexedit) で開いたところ、完全に道に迷ってしまいました。
重要事項 :
- オフセットは、値を含むファイル内のアドレスです。
- 読み取り:
C8 05
ファイル内を読み取る必要があります05C8
。オフセットの例、アドレスは0x5C8
これで、MakeNote セクションは簡単です。
簡単な方法は、MakerNoteセクションのアドレスを含む0x927c MarkerNote
(ファイル内の)フラグを直接検索することです。7C 92
それが見つからない場合は、IFD
セクションを参照して を見つけてEXIF subsection
ください。そして、そのサブセクションにはMakerNoteセクションがあります
Tag Type Count Value
7C 92 07 00 B8 A0 00 00 84 03 00 00
オフセット : 84 03 00 00
-> 00 00 03 84
(0x384
アドレス)
このアドレスに移動し、MakerNote セクションで検索します。FNumber 0x3
Tag Type Count Value
03 00 03 00 04 00 00 00 C8 05 00 00
オフセットに移動して0x5C8
値を見つけます (カウント 4 x タイプ 3 ushort、16 ビット)
0x0x5C8 : 00 00 00 00 00 00 00 00
そして...失敗します。実際、私のカノンはこのセクションを埋めていません。
http://www.exiv2.org/tags.htmlを読むFNumber は EXIF サブセクションにあります。
同じプロセスを実行して、EXIF サブセクションとタグ「0x829d Exif.Image.FNumber
type 5 Rational」を見つけます。有理型は 64 ビット (分子と分母の ulong) で構成されます。
Tag Type Count Value
9D 82 05 00 01 00 00 00 34 03 00 00
そして、0x334
オフセットを読み取ります
1C 00 00 00 0A 00 00 00
16 進数で読めるように : 0x1C
/ 0XA
10 進数で計算します : 28/10
= 14/5
=2.8
ExifRead にこの値があることを確認します
EXIF.py 100EOS5D/IMG_8813.CR2 -vv | grep -i 14/5
EXIF FNumber (Ratio): 14/5
そして出来上がり!
floatを探していましたが2.8
、この値は分数形式で保存されます。したがって、ライブラリは計算を行わず、分数を単純化するだけです。
これが、期待どおり14/5
ではなく、そうでない理由2.8
です。