4

私は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.FNumbertype 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です。

4

2 に答える 2

6

EXIF の読み取りに重点を置いたライブラリを使用することをお勧めします。libraw/rawkit で利用できるものは、本当に素晴らしい追加機能です。ExifReadライブラリをお勧めします。これは純粋な Python であり、非常に高速です。そして、価値観をよりよく理解することができます。

于 2015-11-10T21:12:53.220 に答える