Python给照片添加水印时间和地点 Mac OS


我们平时想打印图片的时候,希望能给照片加上时间、地点,以便以后看到照片的时候不会忘记。
手工一张张添加太麻烦,而且容易出错。以下是使用代码获取原始图片的拍摄时间和地点,并添加水印的方法,在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 =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值