2015-11-09 62 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