python怎么编辑图片_Python 3 如何修改照片的 exif 信息
想写个小程序,目的是将GPS写入照片的exif信息中,没有处理图片信息的经验,找了python 3的相关库,貌似pillow可以处理,但粗看了一下官方文档,貌似只提供了read exif的功能,并没有找到修改exif的方法,还请有经验的大神给些指点。花时间自己解决了一下:目前1pillow包并没有简便的方式修改1exif信息:其只提供了1save()方法,该方法可以将修改好的 exif 信息重新保
想写个小程序,目的是将GPS写入照片的exif信息中,没有处理图片信息的经验,找了python 3的相关库,貌似pillow可以处理,但粗看了一下官方文档,貌似只提供了read exif的功能,并没有找到修改exif的方法,还请有经验的大神给些指点。
花时间自己解决了一下:目前
1pillow
包并没有简便的方式修改
1exif
信息:其只提供了
1save()
方法,该方法可以将修改好的 exif 信息重新保存到照片之中(
1im.save(fp, format, exif=raw_exif)
),但是
1save
方法只接收
1raw_exif
的
1bytes
类型的 exif 数据,这就让人十分抓狂,因为
1pillow
的
1_getexif()
方法返回的是字典格式,即便可以在字典格式中增改了所需要的 exif 信息,也还是需要想办法将修改好的字典转换成
1raw_exif
,可是
1pillow
竟然没有提供这个方法…瞬间无语中。
另一种方法就是通过
1pillow
的
1Image.info['exif']
获得
1raw_exif
信息,然后直接修改二进制 exif 信息,不过这实现起来必将十分蛋疼….首先,做这件事情之前需要对 exif 的编码十分了解,然后还需要将所需要将增改的信息转换成
1bytes
类型,最后还要把信息整合进原始 exif 之中….
综上,基本上放弃了通过
1pillow
包解决这个问题的想法,同时
1_getexif()
方法目前只是个实验方法,不建议使用,所以
1pillow
只能再等等。
1python
中提供的可以修改 exif 信息的包有很多,比如
1pyexiv2
、
1pyxif
…and so on,但不幸的是这些包在 windows 下的最新的 python 版本中都不兼容(我用的是py3.5),试了一晚上只有泪奔。
最终解决方法,直接装一个 py2.7,通过
1pyexiv2
解决,这是
1pyexiv2
的官方文档: http://tilloy.net/dev/pyexiv2…, 其提供了类似 python
1dict
形式的修改 exif 信息的方法,这让修改大多数 exiftag 的信息变得十分方便,但是在处理 GPS 信息的时候则要相对麻烦一点,需要将相应的坐标数据转换成有理数形式,好在
1pyexiv2
提供了相应的方法。
下面是将十进制gps写入图片exif信息的写法,首相将
1float
格式的经纬度转换成度分秒格式,然后将度分秒分别转换成有理数(具分子和分母),最后写入 exiftag 之中:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54import 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)