>>> from env_helper import info; info()
页面更新时间: 2024-04-06 23:07:45
运行环境:
    Linux发行版本: Debian GNU/Linux 12 (bookworm)
    操作系统内核: Linux-6.1.0-18-amd64-x86_64-with-glibc2.36
    Python版本: 3.11.2

3.8. 实例:查询EXIF信息,获取地理位置

前面我们介绍了EXIF所具有的属性,在这里查询图像所有的信息。

3.8.1. 场景说明

Exif是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。只要是拍摄的照片都有这个信息,所以这个信息也是有泄露个人隐私的风险。不过不要担心,微博里发的图片、朋友圈发的图片、QQ空间的图片、都是经过处理的,不会存在信息泄露的风险,想要查看具体的信息需要自己拍摄一张图片来使用

3.8.2. 解决思路

获取图片数据,经经纬度信息转换为位置。

3.8.3. 解决办法

第一步先获取到具体信息。

>>> from PIL import Image, ExifTags
>>>
>>> img = Image.open('.//exif.jpg')
>>> img.info.keys()
dict_keys(['exif', 'dpi'])
>>> len(img.info['exif'])
55220
>>> exifd = img._getexif()
>>> exifd.keys()
dict_keys([34853, 296, 34665, 271, 272, 305, 274, 306, 531, 283, 282, 315, 59932, 40093, 36864, 37377, 37378, 36867, 36868, 37379, 37380, 37381, 37383, 37385, 37386, 37510, 40961, 40962, 40965, 41990, 37520, 37521, 37522, 40963, 33434, 33437, 59933, 42016, 34850, 34855, 41986, 40960, 41987, 41989, 37500])
>>> from PIL import Image
>>> from PIL.ExifTags import TAGS
>>>
>>> ret = {}
>>> fname = './exif.jpg'
>>> img = Image.open(fname)
>>> if hasattr( img, '_getexif' ):
>>>     exifinfo = img._getexif()
>>>     for tag, value in exifinfo.items():
>>>         decoded = TAGS.get(tag, tag)
>>>         ret[decoded] = value
>>>

打印ret会获取到所有的信息,但是这不都是我们想要的,使用属性的键可以得到我们想要的值。

>>> print (ret[ 'Make'])
samsung

查看拍摄时间

>>> print(ret['DateTimeOriginal'])
2020:08:18 12:42:56

查看GPS信息

>>> print(ret[ 'GPSInfo'])
{0: b'x02x02x00x00', 1: 'N', 2: (43.0, 59.0, 54.0), 3: 'E', 4: (125.0, 23.0, 50.0), 5: b'x00', 6: 206.0, 7: (4.0, 41.0, 44.0), 29: '2020:08:18'}

第二步使用我们获取到的GPS信息,转化为可读的地址。

>>> import requests
>>>
>>> ak = 'w6S9De9jTSYnTwuakHZtGVMCwS3mMwpp'
>>> lat=ret[ 'GPSInfo'][2]
>>> lon=ret['GPSInfo'][4]
>>> Lat = float(lat[0]) + float(lat[1]) / 60 + float(lat[2]) / 3600
>>> Lon = float(lon[0]) + float(lon[1]) / 60 + float(lon[2]) / 3600

将GPS转化为经纬度信息,在调用百度地图获取到位置信息。

>>> url = 'http://api.map.baidu.com/reverse_geocoding/v3/?ak={}&output=json&coordtype=wgs84ll&location={},{}'.format(ak,Lat,Lon)
>>> response = requests.get(url).json()
>>> status = response['status']
>>> if status == 0:
>>>     address = response['result']['formatted_address']
>>>     print('地址:', address)
地址: 吉林省长春市宽城区

3.8.4. 总结

Python的优点之一就是他强大而全面的库,多个库结合使用可以解决很多问题。