2015-11-09 76 views
2

我正在寫python腳本,我需要從原始照片文件(例如.CR2)獲取exif信息。Python rawkit如何從RAW文件讀取元數據值?

我發現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) 

但是我有點困惑,怎麼看這個值呢?例如我期待iso值像100/200/400但什麼是-1.182978841800441e + 38

我的問題是不特定的ISO,它也是快門,光圈,...

我ckecked libraw和rawkit文檔,但無法找到如何讀/轉換這種價值觀。

這部分的文檔不是很詳細:

float iso_speed; 
ISO sensitivity. 

float shutter; 
Shutter speed. 

有人可以幫助我瞭解如何閱讀這些價值?

感謝

[更新]

至於新建議,我會用ExifRead。事實上,這是一個更好的選擇,我正在寫一個python腳本。 ExifRead無需額外的C庫依賴。

我能夠打開佳能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) 

龍答案(我怎麼找到/調試那個):

讀這個exelent鏈接Unders tanding什麼是存儲在佳能原始文件.CR2文件,如何和爲什麼(http://lclevy.free.fr/cr2/)我決定解碼自己,並知道發生了什麼事情。

此鏈接給我上格拉爾解碼原始文件cr2_poster.pdf 從我以爲最好的價值似乎是在對FNumber值我的佳能特定製造商註釋部分。 (所有值的描述在這裏canon_tags

Tag Id : 3 (In fact 0x0003 that you write 0x3) 
Name : FNumber 

我打開我的文件與六編輯器(hexedit的)和...我完全失去了。

關鍵的東西:

  • 的偏移將包含值文件中的地址。
  • 閱讀:C8 05中的文件應該被讀取爲05C8。一個偏移量的例子,地址是0x5C8

隨着發現MakeNote部分很容易。

快速方法是直接搜索包含MakerNote部分地址的0x927c MarkerNote(因此在文件7C 92中)標誌。 如果您無法找到,請通過IFD部分找到EXIF subsection。然後在該款你會發現製造商註釋部分

Tag  Type Count  Value 
7C 92 07 00 B8 A0 00 00 84 03 00 00 

偏移:84 03 00 00 - >00 00 03 840x384地址)

到這個地址,並在製造商註釋部分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 

而......失敗,實際上我的canon並未填充此部分。

閱讀http://www.exiv2.org/tags.html FNumber可以在EXIF小節中找到。

執行相同的過程以找到EXIF款和標籤「0x829d Exif.Image.FNumber 5型理性」 理性類型是由64位(分子和分母ulongs)Rational_data_type

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 

正如我們在六閱讀:0x1C/0XA 在小數,做數學題:28/10 = 14/5 = 2.8

驗證我ExifRead

EXIF.py 100EOS5D/IMG_8813.CR2 -vv | grep -i 14/5 
EXIF FNumber (Ratio): 14/5 

瞧這個值!

我一直在尋找2.8 float,並且這個值是以分數格式存儲的。所以圖書館不會做數學計算,只是簡化分數。

這就是爲什麼我們有14/5而不是2.8如預期。

+0

您是否嘗試過從LibRaw運行'raw-identify -v'?輸出是什麼? –

+0

似乎很好:(ISO感光度:400 快門:1/50.0秒 光圈:f/2.8)。我不是一個好的cpp讀者,但我會檢查。也許一個c - > python綁定錯誤 – zipper

+0

可能是類似錯誤的數據類型? –

回答

1

我建議你使用專注於EXIF閱讀的庫。在libraw/rawkit中可用的東西真的只是一個很好的額外。我可以推薦ExifRead庫。它是純Python,速度也很快。它可以讓你更好地理解價值。

+0

沒有注意到ExifRead能夠讀取原始數據。看起來不錯,但不幸的是光圈的值是錯誤的(3而不是2.8)。我將嘗試使用https://github.com/lclevy/libcraw2/blob/master/docs/cr2_poster.pdf解碼自己,以便在ExifRead github上打開一個錯誤 – zipper

+0

我建議您先嚐試ExifTool命令行工具並進行比較。它應該是「參考」。 – letmaik

+0

我發現我的錯誤,並更新我的問題,它與ExifReat合作謝謝 – zipper