Информация EXIF ​​в Python - libexif

Я использовал pyexiv2 для чтения exif-информации из файлов JPEG в python и заметил, что один тег, в частности, ExposureTime, не сообщается exiv2 так же, как с другой библиотекой exif libexif.

Любая утилита на основе exiv2, которую я пробовал, упростит тег времени выдержки до "рационального", такого как 0/1, 0 или аналогичного. Утилиты на основе libexif (в частности, инструмент "exif") сообщат о гораздо более подробном "1/-21474836 сек." для того же тега, на том же изображении.

Во-первых, я хотел бы понять: что может объяснить эту разницу? Я предполагаю, что последний из двух является правильным.

Во-вторых, и предполагая, что более подробный тег, сообщенный libexif, является правильным, я хотел бы иметь возможность получить это значение в Python, где, насколько я вижу, это невозможно при использовании каких-либо инструментов EXIF, с которыми я сталкивался. (например, pyexiv2). Есть ли инструмент или метод, который я не рассматриваю?

Я наткнулся на одно потенциальное решение с использованием библиотеки C libexif в python с ctypes, как отмечено в этом ранее отвеченном вопросе - хотя я не мог найти примеры того, как я мог сделать это.

Любая помощь с благодарностью. Спасибо!

1 ответ

В случае, если это помогает, вот некоторые хаки, которые я недавно сделал, чтобы установить недостающие данные объектива / F-номера,.. информацию, когда я использовал ручную линзу, и я вычислил абсолютное EV актаула для автоматического поиска более поздними инструментами обработки HDR (HDR Luminace). Я прокомментировал действие "написать" для безопасности ниже. Должно быть в значительной степени самоочевидным.

В верхнем разделе файлов представлен список файлов для работы в текущей папке (здесь все *.ARW (файлы Sony raw)). Отрегулируйте шаблон и путь по мере необходимости.

#!/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)
Другие вопросы по тегам