Python中的EXIF信息 - libexif

时间:2014-04-10 22:14:36

标签: python exif libexif exiv2 pyexiv2

我一直在使用pyexiv2从python中的JPEG文件中读取exif信息,并注意到exiv2报告的一个标记--ExposureTime - 与另一个exif库libexif没有相同的报告。

我尝试的任何基于exiv2的实用程序都会将曝光时间标记简化为“理性”#34;例如0 / 1,0或类似的。基于libexif的实用程序(特别是工具" exif")将报告更详细的" 1 / -21474836秒。"对于相同的标签,在同一图像中。

首先,我想了解:有什么可以解释这种差异?我假设两者中的后者是正确的。

其次,假设libexif报告的更详细的标记是正确的,我希望能够在Python中获得这个值,据我所知,使用任何EXIF工具是不可能的我遇到过(例如pyexiv2)。有没有我不考虑的工具或方法?

我在python中使用libexif C库时发现了一个可能的解决方案,其中ctypes为noted in this previously answered question - 虽然我找不到如何执行此操作的示例。

非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

如果这有帮助,我最近做了一些黑客攻击设置丢失的镜头/ F-Number,...信息,因为我使用手动镜头加上我计算的actaul绝对EV,用于后来的HDR处理工具(HDR自动检索) Luminace)。我评论了"写"安全行动如下。应该是非常自我解释的。

顶级文件部分列出了当前文件夹中的文件列表(此处全部为* .ARW(索尼原始文件))。根据需要调整图案和路径。

#!/usr/bin/env python
import os
import time
import array
import math

# make file list (take all *.ARW files in current folder)
files = [f for f in os.listdir(".") if f.endswith(".ARW")]
files.sort()   # just to be nice

# have a dict. of tags to work with in particular
tags = {'Aperture':10., 'Exposure Time ':1./1250, 'Shutter Speed':1./1250, 'ISO':200., 'Stops Above Base ISO':0., 'Exposure Compensation':0. }

# arbitrary chosen base EV to get final EV compensation numbers into +/-10 range
EVref = math.log (math.pow(tags['Aperture'],2.0)/tags['Shutter Speed'], 2.0) - 4
print ('EVref=', EVref)

for f in files:
    print (f)
    meta=os.popen("exiftool "+f).readlines()
    for tag in meta:
        set = str(tag).rstrip("\n").split(":")
        for t,x in tags.items():
            if str(set[0]).strip(" ") == t:
                tags[t] = float ( str(os.popen("calc -- "+set[1]).readlines()).strip("[]'~\\t\\n"))
                print (t, tags[t], set[1])

    ev = math.log (math.pow(tags['Aperture'],2.0)/tags['Shutter Speed'], 2.0)
    EV = EVref - ev + tags['Stops Above Base ISO']
    print ('EV=', EV)
#  uncomment/edit to update EXIF in place:
#    os.system('exiftool -ExposureCompensation='+str(EV)+' '+f)
#    os.system('exiftool -FNumber=10 '+f)
#    os.system('exiftool -FocalLength=1000.0 '+f)
#    os.system('exiftool -FocalLengthIn35mmFormat=1000.0 '+f)