提取EXIF是最容易的部分。最困难的部分是解释它们并使它们适用于每个制造商和型号。有些制造商和型号缺少一些标签(例如,富士有LensMake和LensModel,而佳能只有LensModel)。简而言之,可能是这样的。
from PIL import Image
from math import pow
from PIL.ExifTags import TAGS
import datetime
def get_labeled_exif(exif):
labeled = {}
for (key, val) in exif.items():
labeled[TAGS.get(key)] = val
return labeled
def get_exif(filename):
image = Image.open(filename)
image.verify()
return image._getexif()
def get_shutter_speed(shutter_speed):
print("shutter_speed = {0}, type = {1}".format(
shutter_speed, type(shutter_speed)))
ss_val1 = 0.0
ss_val2 = 0.0
if type(shutter_speed) != type(list):
ss_val1 = shutter_speed
ss_val2 = 0
ss = (str(ss_val1/1) + "s") if ss_val1 > 0 else str(ss_val1)+"s"
return ss
ss_val1 = float(shutter_speed[0])
ss_val2 = float(shutter_speed[1])
ss = ss_val1/ss_val2
return str(round(1/pow(2, ss))) + \
"s" if ss_val1 < 0 else "1/"+str(round(pow(2, ss)))
def get_aperture(aperture):
print("aperture = {0}, type(aperture) = {1}".format(
aperture, type(aperture)))
ap_val1 = 0.0
ap_val2 = 0.0
if type(aperture) != type(list):
ap = float(aperture)
else:
ap_val1 = float(aperture[0])
ap_val2 = float(aperture[1])
ap = ap_val1/ap_val2
print("get_aperture:: ap_val1 = {0}, ap_val2 = {1}, aperture = {2}".format(ap_val1, ap_val2, ap))
return "f/"+str(ap)
def get_exposure_mode(mode):
if mode == 0:
return "Auto"
elif mode == 1:
return "Manual"
else:
return "Auto Bracket"
def get_light_source(ls_val):
if ls_val==10:
return "Cloudy Weather"
elif ls_val==13:
return "Cool White Fluorescent"
elif ls_val==1:
return "Daylight"
elif ls_val==12:
return "Daylight Fluorescent"
elif ls_val==13:
return "Day White Fluorescent"
elif ls_val==9:
return "Fine Weather"
elif ls_val==4:
return "Flash"
elif ls_val==2:
return "Fluorescent"
elif ls_val==11:
return "Shade"
elif ls_val==3:
return "Tungsten (Incandescent Light)"
elif ls_val==15:
return "White Fluorescent"
else:
return "Other Light Source"
def printFujifilmExif(labeled):
shutter_speed = get_shutter_speed(labeled['ExposureTime'])
aperture = get_aperture(labeled['FNumber'])
format = "%Y:%m:%d %H:%M:%S"
date_created = datetime.datetime.strptime(labeled['DateTimeOriginal'], format)
exposure_mode = get_exposure_mode(labeled['ExposureMode'])
light_source = get_light_source(
labeled['LightSource'])
iso_value = labeled['ISOSpeedRatings']
camera_make = labeled['Make']
camera_model = labeled['Model']
lens_make = labeled['LensMake']
lens_model = labeled['LensModel']
software = labeled['Software']
print("\n\nPRINTING PROFILE FOR FUJIFILM***")
print("Camera Make: {0}".format(camera_make))
print("Camera Model: {0}".format(camera_model))
print("Lens Make: {0}".format(lens_make))
print("Lens Model: {0}".format(lens_model))
print("Date taken: {0}".format(date_created))
print("Aperture: {0}".format(aperture))
print("Shutter speed: {0}".format(shutter_speed))
print("ISO: {0}".format(iso_value))
print("Exposure mode: {0}".format(exposure_mode))
print("Light source: {0}".format(light_source))
print("Softwawre = {0}".format(software))
def printExifInfo(file_name):
exif = get_exif(file_name)
labeled = get_labeled_exif(exif)
print("EXIF: {0}\n\n".format(labeled))
if labeled['Make'].upper()=="FUJIFILM":
printFujifilmExif(labeled)
else:
printCanonExif(labeled)
print("****Printing Fujifilm profile****")
printExifInfo('DSCF3846_Lowres.jpg')
示例输出
打印富士胶片的设置信息:
EXIF:{'ResolutionUnit': 2, 'ExifOffset': 446, 'Make': 'FUJIFILM', 'Model': 'GFX 50S', 'Software': 'GIMP 2.10.18','DateTime': '2021:05:14 22:58:13','Copyright': '
', 'XResolution': 72.0, 'YResolution': 72.0, 'ExifVersion': b'0230','ShutterSpeedValue': 8.965784,'ApertureValue': 4.970854,'DateTimeOriginal': '2021:05:14 15:51:42','DateTimeDigitized':'2021:05:14 15:51:42','BrightnessValue': 9.94,'ExposureBiasValue': 0.0,'MaxApertureValue': 5.0,'MeteringMode': 5,'LightSource': 1,'Flash': 0,'FocalLength': 196.5,'ColorSpace': 1,'ExifImageWidth':7333,'FocalPlaneXResolution': 914.0,'FocalPlaneYResolution': 914.0,'ExifImageHeight': 5500,'FocalPlaneResolutionUnit': 3,'Sharpness': 0,'SubjectDistanceRange': 0,'SensingMethod': 2,'FileSource': b'\x03','ExposureTime': 0.002,'FNumber': 5.6,'SceneType': b'\x01','ExposureProgram': 1,'CustomRendered': 0,'ISOSpeedRatings': 100,'ExposureMode': 1,'SensitivityType': 1,'StandardOutputSensitivity': 100,'WhiteBalance': 1,'BodySerialNumber': '72012151','LensSpecification': (196.5, 196.5, 5.656854256854257, 5.656854256854257),'LensMake': 'FUJIFILM','LensModel': 'GF100-200mmF5.6 R LM OIS WR','LensSerialNumber': '88A10682','FocalLengthIn35mmFilm': 155,'SceneCaptureType': 0}
shutter_speed = 0.002,type = <class'PIL.TiffImagePlugin.IFDRational'> 快门速度不是一个列表。快门速度值:0.002,类型 <class'PIL.TiffImagePlugin.IFDRational'> get_shutter_speed :: ss_val1 = 0.002,ss = 1/500s 光圈值:5.6,类型(光圈)= <class'PIL.TiffImagePlugin.IFDRational'> get_aperture :: ap_val1 = 0.0,ap_val2 = 0.0,光圈 = 5.6
打印富士胶片的设置信息:
相机制造商:FUJIFILM 相机型号:GFX 50S 镜头制造商:FUJIFILM 镜头型号:GF100-200mmF5.6 R LM OIS WR 拍摄日期:2021年05月14日 光圈:f/5.6 快门速度:1/500s 感光度:100 曝光模式:手动 光源:日光 软件 = GIMP 2.10.18