导入电脑上的图片也是同理,我随意打开一张电脑中保存的以前旅游的照片,选择查看图片的“属性”选项中的“详细信息”就可以看到如下细节。
注意下方的EXIF,图片的定位信息就隐含在其中。EXIF可交换文件图像的简称,全称是Exchangeable Image File。它是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。EXIF可以附加于JPEG、TIFF、RIFF等文件之中,为其增加有关数码相机拍摄信息的内容和索引图或图像处理软件的版本信息。当然很关键的拍摄位置信息也在其中,如上图所示的拍摄地点的经度、纬度和高度这些敏感信息。看完上面的描述,是不是有这样一种可能,某有心人查看了你的朋友圈,并把你发的照片通过软件做成一张你日常生活轨迹的图片,通过这样的方式你的行踪是不是会一览无余呢?我只能说:是也不是,这完全取决于你的安全意思。简单一句就是:不要发原图!不要发原图!!不要发原图!!!通过读取原图信息,能轻易获取图片拍摄的准确位置;反之也能轻易隐藏原图的地理位置。而这一切,我们通过python可以很容易做到。
今天只是做一个简单的图片定位,这需要用到一些线上工具。今天我们用百度地图开放平台中的逆地理编码功能,首先在这个平台上创建一个应用,然后获取相应的API的key来实现我们的图片地理位置的提取,当然其他的AI平台也是可以的。
高德地图也提供这样的API,获取的地理位置要更详细一些,只是两个平台API调用的格式有很大差异,今天我们就用百度的开放地图试一试照片定位功能的实现吧。
当然首先要安装一些python支持库,如exifread、requests、json等,其中exifread就是用来读取照片信息的库。
源程序如下所示。
import requestsimport exifreadclass GetPhotoInfo:def __init__(self, photo):self.photo = photo# 百度地图ak 请替换为自己申请的ak self.ak = 'key'#此处填入百度地图开放平台上所获得的key self.location = self.get_photo_info()def get_photo_info(self, ):with open(self.photo, 'rb') as f:
tags = exifread.process_file(f)try:# 打印照片其中一些信息 print('拍摄时间:', tags['EXIF DateTimeOriginal'])print('照相机制造商:', tags['Image Make'])print('照相机型号:', tags['Image Model'])print('照片尺寸:', tags['EXIF ExifImageWidth'], tags['EXIF ExifImageLength'])# 纬度 lat_ref = tags["GPS GPSLatitudeRef"].printable
lat = tags["GPS GPSLatitude"].printable[1:-1].replace(" ", "").replace("/", ",").split(",")
lat = float(lat[0]) + float(lat[1]) / 60 + float(lat[2]) / float(lat[3]) / 3600 if lat_ref != "N":
lat = lat * (-1)# 经度 lon_ref = tags["GPS GPSLongitudeRef"].printable
lon = tags["GPS GPSLongitude"].printable[1:-1].replace(" ", "").replace("/", ",").split(",")
lon = float(lon[0]) + float(lon[1]) / 60 + float(lon[2]) / float(lon[3]) / 3600 if lon_ref != "E":
lon = lon * (-1)except KeyError:return "ERROR:请确保照片包含经纬度等EXIF信息。" else:print("经纬度:", lat, lon)return lat, londef get_location(self):
url = 'http://api.map.baidu.com/reverse_geocoding/v3/?ak={}&output=json' \'&coordtype=wgs84ll&location={},{}'.format(self.ak, *self.location)
response = requests.get(url).json()
status = response['status']if status == 0:
address = response['result']['formatted_address']print('详细地址:', address)else:print('baidu_map error')if __name__ == '__main__':
Main = GetPhotoInfo(r'C:\Users\Administrator\Desktop\test1.jpg')
Main.get_location()
目标图片是如下这样的,是在拉萨拍得,具体时间和地点有些忘记了。
该照片的EXIF信息就完全呈现出来了,拍摄用的手机型号、拍照的经纬度、详细地址一目了然哦,是不是有些细思极恐啊?后续我尝试了一下用ps压缩一下这张图片(当然没有做其他处理,将原图从6M压缩到1M左右),照片的详细信息依然如上图所示一样样。
这是我在朋友圈随意找的一张图片,看看能不能将其定位吧,结果是这样的。
看来朋友圈的图片是无法定位的,大家可以稍稍放心啦!因为微信专门为这件事辟过谣。
是不是这样就可以避免照片位置信息的泄露呢,有些技术手段是超出大家认知的,能不能恢复大家自己掂量,鄙人也说不准呢!当然既然可以识别照片的位置信息,那么更改其位置信息也是小菜一碟的。
现实生活中,关于信息泄露的问题无处不在的,在这只能提高意思加强个人防范,我们在享受信息化生活便利的同时也要避免受到不必要的骚扰。
简单给大家几个有用的防范常识吧:
1. 不用可疑的软件,不随意提供个人信息;
2. 安装App时只赋予最小权限,关闭不必要的功能; 3. 各种缴费单据、快递包装等在丢弃前涂抹上面的个人信息; 4. 不在社交软件上晒定位、照片等其他信息; 5. 朋友圈等关闭允许陌生人查看十张照片等功能; 6. 不在或少在公开场合连接不安全的WIFI热点等。当然如果你想“查房”,最简单的办法是,叫他(她)给你发实时原图就可以啦,不会python也没问题(网上有很多查EXIF的工具的),当然前提是他(她)还不会使用软件来更改照片的EXIF信息。看到最后,希望大家不要后背发凉就好,呵呵!!!