python给图片创建EXIF字典并添加GPS信息

  • 这里的图片一般为截图。

  • 若导入的图片是相机拍摄的,则该图片自带EXIF字典,故不需要创建EXIF字典这一步骤,直接更改EXIF信息即可。

在线查看照片EXIF信息网站(包含拍摄地点(GPS)、快门速度、ISO、光圈、拍摄时间等信息)EXIF信息查看器 (tuchong.com)

最终借助 copilot 完成了以下 python 代码:

1、GPS坐标以度分秒形式输入

# 2023-12-28 15:41
# 需求:用python写一段给photo.jpg增加gps信息的程序
from PIL import Image
import piexif

# 打开图片
img = Image.open('photo.jpg')

# 创建一个新的EXIF字典
exif_dict = {"0th":{}, "Exif":{}, "GPS":{}, "1st":{}, "thumbnail":None}

# 创建一个GPS信息字典
# 注意:这里的经度、纬度和海拔是示例值,你需要替换为实际的GPS信息
# GPS信息需要以(度,分,秒)的形式表示,每个值都是一个二元组,第一个元素是数值,第二个元素是分母
gps_info = {
    piexif.GPSIFD.GPSLatitude: ((30, 1), (19, 1), (19, 1)),
    piexif.GPSIFD.GPSLongitude: ((120, 1), (22, 1), (31, 1)),
    piexif.GPSIFD.GPSAltitude: (500, 1),  # 海拔高度,单位为米
    piexif.GPSIFD.GPSLatitudeRef: 'N',  # 'N'表示北纬,'S'表示南纬
    piexif.GPSIFD.GPSLongitudeRef: 'E',  # 'E'表示东经,'W'表示西经
}

# 将GPS信息添加到EXIF字典中
exif_dict['GPS'] = gps_info

# 将EXIF字典转换为字节串
exif_bytes = piexif.dump(exif_dict)

# 将带有EXIF信息的字节串插入到图片中
img.save('photo_with_gps_copilot_dufenmiao.jpg', exif=exif_bytes)

2、GPS坐标以十进制格式输入

# # 2023-12-28 16:26
# 这段代码首先定义了一个函数decimal_to_dms,用于将十进制的经纬度转换为度分秒的形式。然后,它打开了一个名为photo.jpg的图片,并创建了一个新的EXIF字典。接着,它将你的经纬度转换为度分秒的形式,并创建了一个GPS信息字典。然后,它将GPS信息添加到EXIF字典中,并将EXIF字典转换为字节串。最后,它将带有EXIF信息的字节串插入到图片中,并保存了这个图片。新的图片名为photo_with_gps_copilot_shijinzhi.jpg

# 输入经纬度为十进制格式
# 在这种情况下,我们需要将十进制的经纬度转换为度分秒(DMS)的形式。以下是转换的步骤:
# 1.度(D)是十进制经纬度的整数部分。
# 2.分(M)是十进制经纬度的小数部分乘以60的整数部分。
# 3.秒(S)是十进制经纬度的小数部分乘以60后的小数部分再乘以60
from PIL import Image
import piexif
# 然后,你可以使用这个函数来转换你的经纬度,并将其添加到EXIF信息中:
def decimal_to_dms(decimal):
    degree = int(decimal)
    temp = (decimal - degree) * 60
    minute = int(temp)
    second = int(temp - minute) * 60
    return ((degree, 1), (minute, 1), (second, 1))

# 打开图片
img = Image.open('photo.jpg')

# 创建一个新的EXIF字典
exif_dict = {"0th":{}, "Exif":{}, "GPS":{}, "1st":{}, "thumbnail":None}

# 你的经纬度
latitude_decimal = 30.363497830648367
longitude_decimal = 120.39312053918955

# 转换为度分秒形式
latitude_dms = decimal_to_dms(latitude_decimal)
longitude_dms = decimal_to_dms(longitude_decimal)

# 创建一个GPS信息字典
gps_info = {
    piexif.GPSIFD.GPSLatitude: latitude_dms,
    piexif.GPSIFD.GPSLongitude: longitude_dms,
    piexif.GPSIFD.GPSAltitude: (500, 1),  # 海拔高度,单位为米
    piexif.GPSIFD.GPSLatitudeRef: 'N',  # 'N'表示北纬,'S'表示南纬
    piexif.GPSIFD.GPSLongitudeRef: 'E',  # 'E'表示东经,'W'表示西经

    # piexif.GPSIFD.GPSLatitude: ((30, 1), (19, 1), (19, 1)),
    # piexif.GPSIFD.GPSLongitude: ((120, 1), (22, 1), (31, 1)),
    # piexif.GPSIFD.GPSAltitude: (500, 1),  # 海拔高度,单位为米
    # piexif.GPSIFD.GPSLatitudeRef: 'N',  # 'N'表示北纬,'S'表示南纬
    # piexif.GPSIFD.GPSLongitudeRef: 'E',  # 'E'表示东经,'W'表示西经
}

# 将GPS信息添加到EXIF字典中
exif_dict['GPS'] = gps_info

# 将EXIF字典转换为字节串
exif_bytes = piexif.dump(exif_dict)

# 将带有EXIF信息的字节串插入到图片中
img.save('photo_with_gps_copilot_shijinzhi.jpg', exif=exif_bytes)
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值