python怎么编辑图片_Python 3 如何修改照片的 exif 信息

花时间自己解决了一下:目前pillow包并没有简便的方式修改 exif 信息:其只提供了save()方法,该方法可以将修改好的 exif 信息重新保存到照片之中(im.save(fp, format, exif=raw_exif)),但是save方法只接收raw_exif的bytes类型的 exif 数据,这就让人十分抓狂,因为pillow的_getexif() 方法返回的是字典格式,即便可以在字典格式中增改了所需要的 exif 信息,也还是需要想办法将修改好的字典转换成raw_exif,可是pillow竟然没有提供这个方法...瞬间无语中。

另一种方法就是通过pillow的Image.info['exif']获得raw_exif信息,然后直接修改二进制 exif 信息,不过这实现起来必将十分蛋疼....首先,做这件事情之前需要对 exif 的编码十分了解,然后还需要将所需要将增改的信息转换成bytes类型,最后还要把信息整合进原始 exif 之中....

综上,基本上放弃了通过pillow包解决这个问题的想法,同时_getexif()方法目前只是个实验方法,不建议使用,所以pillow只能再等等。

python中提供的可以修改 exif 信息的包有很多,比如 pyexiv2、pyxif...and so on,但不幸的是这些包在 windows 下的最新的 python 版本中都不兼容(我用的是py3.5),试了一晚上只有泪奔。

最终解决方法,直接装一个 py2.7,通过 pyexiv2 解决,这是pyexiv2的官方文档: http://tilloy.net/dev/pyexiv2..., 其提供了类似 python dict 形式的修改 exif 信息的方法,这让修改大多数 exiftag 的信息变得十分方便,但是在处理 GPS 信息的时候则要相对麻烦一点,需要将相应的坐标数据转换成有理数形式,好在pyexiv2提供了相应的方法。

下面是将十进制gps写入图片exif信息的写法,首相将float格式的经纬度转换成度分秒格式,然后将度分秒分别转换成有理数(具分子和分母),最后写入 exiftag 之中:

import pyexiv2 as ev

def to_deg(value, loc):

"""convert decimal coordinates into degrees, munutes and seconds tuple

Keyword arguments: value is float gps-value, loc is direction list ["S", "N"] or ["W", "E"]

return: tuple like (25, 13, 48.343 ,'N')

"""

if value < 0:

loc_value = loc[0]

elif value > 0:

loc_value = loc[1]

else:

loc_value = ""

abs_value = abs(value)

deg = int(abs_value)

t1 = (abs_value-deg)*60

min = int(t1)

sec = round((t1 - min)* 60, 5)

return (deg, min, sec, loc_value)

def set_gps_location(file_name, lat, lng):

"""Adds GPS position as EXIF metadata

Keyword arguments:

file_name -- image file

lat -- latitude (as float)

lng -- longitude (as float)

"""

lat_deg = to_deg(lat, ["S", "N"])

lng_deg = to_deg(lng, ["W", "E"])

print lat_deg

print lng_deg

# class pyexiv2.utils.Rational(numerator, denominator) => convert decimal coordinates into degrees, munutes and seconds

exiv_lat = (ev.Rational(lat_deg[0]*60+lat_deg[1],60),ev.Rational(lat_deg[2]*100,6000), ev.Rational(0, 1))

exiv_lng = (ev.Rational(lng_deg[0]*60+lng_deg[1],60),ev.Rational(lng_deg[2]*100,6000), ev.Rational(0, 1))

exiv_image = ev.ImageMetadata(file_name)

exiv_image.read()

# modify GPSInfo of image

exiv_image["Exif.GPSInfo.GPSLatitude"] = exiv_lat

exiv_image["Exif.GPSInfo.GPSLatitudeRef"] = lat_deg[3]

exiv_image["Exif.GPSInfo.GPSLongitude"] = exiv_lng

exiv_image["Exif.GPSInfo.GPSLongitudeRef"] = lng_deg[3]

exiv_image["Exif.Image.GPSTag"] = 654

exiv_image["Exif.GPSInfo.GPSMapDatum"] = "WGS-84"

exiv_image["Exif.GPSInfo.GPSVersionID"] = '2 2 0 0'

exiv_image.write()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值