Python rawkit如何从RAW文件读取元数据值?

问题描述 投票:2回答:2

我正在编写python脚本,我需要从原始照片文件(例如.CR2)中获取exif信息。

我发现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)

但是我有点困惑,如何读取这些值?。例如,我期望像[[100/200/400这样的iso值,但是什么是-1.182978841800441e + 38

我的问题不是专门针对iso,它也适用于快门,光圈,...

我查看了libraw和rawkit文档,但无法找到如何读取/转换这种值的方法。

文档中的这一部分不是很详细:

float iso_speed; ISO sensitivity. float shutter; Shutter speed.

有人可以帮助我了解如何读取这些值吗?

谢谢

[更新]

正如neo所建议的,我将使用ExifRead。实际上,这是一个更好的选择,我正在编写python脚本。使用ExifRead,不需要额外的C库依赖项。

我能够打开Canon原始文件并解析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)

长答案

(我如何找到/调试它的方法:)>阅读此实用链接了解佳能RAW .CR2文件中存储的内容,原因和方式(http://lclevy.free.fr/cr2/,我决定对自己进行解码并知道发生了什么。

此链接发送给我,以解码原始文件cr2_poster.pdf因此,我认为最好的值似乎是在FNumber值的特定于Canon的MakerNote部分中。 (所有值描述在这里canon_tags

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

我用Hexa编辑器(hexedit)打开了文件,然后……我完全迷失了。

关键事项:

    偏移量是文件中将包含您的值的地址。
  • 读取:应读取文件中的C8 05 05C8。偏移量示例,地址为0x5C8
  • 有了这个发现,MakeNote部分很容易。

快速方法是直接搜索包含MakerNote部分地址的0x927c MarkerNote(因此在文件7C 92中)标志。如果找不到,请遍历IFD部分找到EXIF subsection。然后在该小节中,您将找到MakerNote部分

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

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

转到此地址并在MakerNote部分中搜索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

而且...失败,实际上我的教规没有填写本节。

读取http://www.exiv2.org/tags.html FNumber可以在EXIF小节中找到。

执行相同的过程以找到EXIF子节和标记“0x829d Exif.Image.FNumbertype 5 Rational”有理类型由64位(分子和分母ulong)组成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浮点数,并且此值以小数格式存储。因此,库不进行数学运算,只是简化了分数。

这就是为什么我们有14/5而不是预期的2.8

我正在编写python脚本,我需要从原始照片文件(例如.CR2)中获取exif信息。我发现Python Rawkit可以做到这一点。使用Raw(filename = image_path)作为raw:...

python metadata photo libraw
2个回答
3
投票
我建议您使用专注于EXIF读取的库。 libraw / rawkit中可用的东西实际上只是一个不错的补充。我可以推荐ExifRead库。这是纯Python,而且该死的也很快。而且它使您更好地了解价值观。

0
投票
如果要与多种格式兼容对您而言不是性能问题,那么可以将exiftool作为带有-j选项的子进程调用,以提供一个json字符串,您可以将其转换为字典。
© www.soinside.com 2019 - 2024. All rights reserved.