前面介绍了EXIF所具有的属性,在这里查询图像所有的信息。 EXIF(Exchangeable Image File Format)是一种图像文件格式, 用于在数字相机、智能手机和其他数码设备中存储图像的元数据信息。 EXIF信息代表的是可交换图像文件信息。当储存JPEG或者TIFF格式的照片时, 这张照片的所有信息都储存在EXIF信息中。几乎所有的相机厂商都支持拍摄的照片输出EXIF信息。
场景说明
Exif是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。 只要是拍摄的照片都有这个信息,所以这个信息也是有泄露个人隐私的风险。不过不要担心, 微博里发的图片、朋友圈发的图片、QQ空间的图片、都是经过处理的,不会存在信息泄露的风险, 想要查看具体的信息需要自己拍摄一张图片来使用。
解决思路
获取图片数据,经经纬度信息转换为位置。
解决办法
第一步先获取到具体信息。
from PIL import Image, ExifTags
img = Image.open('/data/demo/exif.jpg')
img.info.keys()
dict_keys(['exif', 'xmp', '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 = '/data/demo/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'\x02\x02\x00\x00', 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)
地址: 吉林省长春市宽城区鑫盛大路