我正在写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 84
(0x384
地址)
到这个地址,并在制造商注释部分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
如预期。
您是否尝试过从LibRaw运行'raw-identify -v'?输出是什么? –
似乎很好:(ISO感光度:400 快门:1/50.0秒 光圈:f/2.8)。我不是一个好的cpp读者,但我会检查。也许一个c - > python绑定错误 – zipper
可能是类似错误的数据类型? –