女朋友背着我用Python偷偷隐瞒行踪如果女朋友知道Python,那岂不是要出车祸了?如果是这样的话,女友发的图片中包含的地理位置是不是真实的呢?有大大大大的问号吗?其实用Python修改图片的地理位置是很方便的。2.编写代码在编写脚本之前,需要在虚拟环境中安装依赖库:piexif第一步,我们读取原图的经纬度,然后将地理位置格式化成浮点型。得到GPS图片坐标后,需要转换成火星坐标系数据。defread_image(self,image_path):"""开始处理图片exifread:读取图片属性:return:"""exif_dict=piexif.load(image_path)ifexif_dict['GPS']:#latitudegps_lati_pre=exif_dict['GPS'][2]gps_lati=dms_to_gps(gps_lati_pre)#longitudegps_long_pre=exif_dict['GPS'][4]gps_long=dms_to_gps(gps_long_pre)#GPS坐标转换为高德坐标lng,lat=wgs84togcj02(gps_long,gps_lati)print(f"地理信息原图位置如下\n经度:{lng}\n纬度:{lat}\n")returnf'{lng},{lat}'else:print(f'抱歉!此图不包含地理位置!')第二步是使用高德Web服务API中的反向地理编码解析出原始图像的详细位置。defget_address_by_location(self,location):"""通过经纬度获取位置:paramlocation::return:"""params={'key':self.ak,'location':location,'sig':self.sign}resp=json.loads(requests.get(url=self.url_regeo,params=params).text)ifrespandresp.get('regeocode')andresp.get('regeocode').get('formatted_address'):address=resp.get('regeocode').get('formatted_address')print(f'原图拍摄地址为:{address}\n')else:print('api解析地址错误,请检查ak!\n')第三步是寻找目标地理位置。首先输入目标城市和具体地址,使用高德Web服务API中的地理编码获取需要定位的地理位置。defget_location_by_address(self,city,address):"""通过地理位置获取经纬度地理编码:https://lbs.amap.com/api/webservice/guide/api/georegeo/:paramaddress::return:"""params={'key':self.ak,'city':city,'address':address,'sig':self.sign}resp=json.loads(requests.get(url=self.url_geo,params=参数).text)#获取坐标地址ifrespandlen(resp.get('geocodes'))>=1andresp.get('geocodes')[0].get('location'):location=resp.get('geocodes')[0].get('location')gps_data=location.split(',')#获取经纬度gps_long=float(gps_data[0])gps_lati=float(gps_data[1])returnps_long,gps_latielse:print('api解析地址错误,请检查ak!')returnNone第四步,修改图片的地理位置。由于piexif中的经纬度数据是元组类型,所以要设置的数据需要处理一次。defgps_to_dms(gps_data):"""坐标转换为度分秒(double)116.397451http://www.gzhatu.com/du2dfm.html:paramgps_data::return:{1:b'N',2:((22,1),(32,1),(945,100)),3:b'E',4:((114,1),(1,1),(3445,100))"""#degree:四舍五入gps_degree=math.floor(gps_data)gps_data_temp1=(gps_data-gps_degree)*60#minutegps_minute=math.floor(gps_data_temp1)gps_data_temp2=gps_data_temp1-gps_minute#seconds,小数点后取4位gps_second=round(gps_data_temp2*60,2)#注意:秒数必须转为整数result=((gps_degree,1),(gps_minute,1),(int(gps_second*100),100))returnresult最后将经纬度数据写入图片的正确格式。defwrite_image(self,image_path,gps_long,gps_lati):"""修改文件夹下所有文件的属性:paramimage_path:folderpath:return:"""#读取图片img=Image.open(image_path)try:exif_dict=piexif.load(img.info['exif'])except:print('加载文件位置异常!')return#修改位置#GPSGPSLatitudeRef:N#GPSGPSLatitude:[22,32,189/20]#GPSGPSLongitudeRef:E#GPSGPSLongitude:[114,1,689/20]exif_dict['GPS'][2]=gps_to_dms(gps_lati)exif_dict['GPS'][4]=gps_to_dms(gps_long)exif_bytes=piexif.dump(exif_dict)#writetonewGo到图片中的img.save(image_path,'jpeg',exif=exif_bytes)。3.结果与结论通过以上4个步骤,可以将任意地理位置写入图片。除了地理位置,图片的元数据,包括:拍摄设备、拍摄时间、拍摄参数都可以修改两次。
