这里写目录标题
我们平时想打印图片的时候,希望能给照片加上时间、地点,以便以后看到照片的时候不会忘记。
手工一张张添加太麻烦,而且容易出错。以下是使用代码获取原始图片的拍摄时间和地点,并添加水印的方法,在Mac OS下对jpeg、jpg文件处理已经测试通过了。
效果
首先我们看下效果,第一张是原图,第二张是添加水印时间和地点后的图:
需要用到的模块
exifread
PIL
requests
json
处理步骤以及代码讲解
1、获得照片的拍摄时间
这里我们需要用到exifread模块以获取照片的拍照时间。1
def getPhotoTime(filename):
'''得到照片的拍照时间(如果获取不到拍照时间,则使用文件的创建时间)
'''
try:
if os.path.isfile(filename):
fd = open(filename, 'rb')
else:
raise "[%s] is not a file!\n" % filename
except:
raise "unopen file[%s]\n" % filename
#默认用图像文件的创建日期作为拍摄日期(如果有照片的拍摄日期,则修改为拍摄日期
state = os.stat(filename)
dateStr = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(state[-2]))
data = exifread.process_file( fd )
if data: #取得照片的拍摄日期,改为拍摄日期
try:
t = data['EXIF DateTimeOriginal'] #转换成 yyyy-mm-dd_hh:mm:ss的格式
dateStr = str(t).replace(":","-")[:10] + str(t)[10:]
except:
pass
return dateStr
2、获取拍照地点
这里我们依然要用到exifread模块以获取照片的拍照的经纬度,在使用baidu的api逆地理编码得到对应的具体位置。2
注意在使用baidu的api之前需要去百度地图开放平台注册账号,申请secret_key,可以参考别人的申请ak3。
def format_lat_lng(data):
'将exif得到的经纬度转化成数值, 这个有点笨重'
list_tmp=str(data).replace('[', '').replace(']', '').split(',')
l= [ele.strip() for ele in list_tmp]
data_sec = int(l[-1].split('/')[0]) /(int(l[-1].split('/')[1])*3600)# 秒的值
data_minute = int(l[1])/60
data_degree = int(l[0])
result=data_degree + data_minute + data_sec
return result
def getLocationBy_lat_lng(lat, lng):
"""
使用Geocoding API把经纬度坐标转换为结构化地址。需要注册baidu map api的key
"""
secret_key = 'XXXXX你得ak密钥' # 请修改这里
# 使用说明http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding-abroad
baidu_map_api = 'http://api.map.baidu.com/reverse_geocoding/v3/?ak={0}&output=json&coordtype=wgs84ll&location={1},{2}'.format(
secret_key, lat, lng)
response = requests.get(baidu_map_api)
content = response.text
baidu_map_address = json.loads(content)
formatted_address =