700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > python读取raw数据文件_Python rawkit如何从RAW文件读取元数据值?

python读取raw数据文件_Python rawkit如何从RAW文件读取元数据值?

时间:2021-02-06 11:59:27

相关推荐

python读取raw数据文件_Python rawkit如何从RAW文件读取元数据值?

我正在编写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,而且该死的也很快。它使您更好地理解价值观。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。