>>> 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的优点之一就是他强大而全面的库,多个库结合使用可以解决很多问题。