我正在编写python脚本,我需要从原始照片文件(例如.CR2)获取exif信息。
我发现PythonRawkit可以做到这一点。
withRaw(filename=image_path)asraw:printraw.metadataMetadata(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,而是针对快门,光圈,...
我查看了libraw和rawkit文档,但无法找到如何读取/转换这种值。
该文档中的这一部分不是很详细:
float iso_speed;ISO sensitivity.float shutter;Shutterspeed.
有人可以帮助我了解如何读取这些值吗?
谢谢
[更新]
正如neo所建议的,我将使用ExifRead。实际上,这是一个更好的选择,我正在编写python脚本。使用ExifRead不需要额外的C库依赖关系。
我能够打开Canon原始文件并解析Exif,但是不幸的是光圈值错误:
EXIFApertureValue(Ratio):3# My photo was taken in 2.8 (maybe a rounded value on this flag ?)
快速解答:使用Fnumber标志
EXIFFNumber(Ratio):14/514/5isinfact2.8(dothe math)
长答案(我如何找到/调试):
阅读此实用链接,了解佳能RAW.CR2文件中存储的内容,方式和原因(http://lclevy.free.fr/cr2/),我决定对自己进行解码并知道发生了什么。
此链接发送给我,以解码原始文件cr2_poster.pdf。从那以后,我认为最好的值似乎是在我的特定于Canon的MakerNote部分中的FNumber值。(所有值描述在此处canon_tags)
TagId:3(Infact0x0003that you write0x3)Name:FNumber
我用Hexa编辑器(hexedit)打开了文件,然后……我完全迷失了。
关键事项:
偏移量是文件中包含您的值的地址。
读取:C8 05应读取文件中的内容05C8。偏移量示例,地址为0x5C8
有了这个发现,MakeNote部分就很容易了。
快速方法是直接搜索包含MakerNote部分地址的0x927c MarkerNote(在文件中7C 92)标记。如果找不到,请遍历该IFD部分以找到EXIF subsection。然后在该小节中,您将找到MakerNote部分
TagTypeCountValue7C920700B8 A0000084030000
偏移:84 03 00 00->00 00 03 84(0x384地址)
转到该地址,然后在MakerNote部分中搜索FNumber 0x3
TagTypeCountValue0300030004000000C8050000
转到偏移量0x5C8以找到我们的值(计数4 x类型3 ushort,16位)
0x0x5C8:0000000000000000
而且...失败,实际上我的教规没有填写此部分。
进行相同的过程以找到EXIF子节,并标记“0x829d Exif.Image.FNumber类型5 Rational”标记Rational类型由64位(分子和分母ulong组成)组成Rational_data_type
TagTypeCountValue9D8205000100000034030000
然后读取0x334偏移量
1C0000000A000000
正如我们在十六进制中所读到的:0x1C/0XA以十进制形式,请进行数学运算:28/10=14/5=2.8
验证我在ExifRead中具有此值
EXIF.py100EOS5D/IMG_8813.CR2-vv|grep-i14/5EXIFFNumber(Ratio):14/5
瞧!
我正在寻找2.8浮点数,并且此值以小数格式存储。因此,库不进行数学运算,而只是简化分数。
这就是为什么我们拥有14/5而不是2.8预期的原因。
解决方案
我建议您使用专注于EXIF读取的库。libraw / rawkit中可用的东西实际上只是一个不错的补充。我可以推荐ExifRead库。它是纯Python,而且该死的也很快。它使您更好地理解价值观。