Python-5分钟教你用图片定位具体地址!
图片信息也是存在元数据的,网上官方称之为exif(exchange image file format),中文意思是交换图像文件格式。要注意的是有些图片是没有元数据的,比如压缩过的图片,元数据被破坏,无法探测,所以图片一定要是原图。如果你想用微信朋友圈,微博的图片来测试这次的代码,怕是没有希望了,因为都是被压缩过的图片。后续会提供一些额外思路,通过图片来定位物理信息在网络安全中还是非常有用途的。
这次用到的是python第三方库exifread,通过此库可以直接对图片进行元数据的读取。读取后其中有4项是关于GPS的经纬度坐标,将其清洗转化为gps在线网页(http://www.gpsspg.com/maps.htm)查询的经纬度格式。
# -*- coding: utf-8 -*-
"""
@desc: 读取图片,解析其中的元数据小脚本
在线GPS定位网站:http://www.gpsspg.com/maps.htm
"""
import os
import exifread
class MetaPicture(object):
# 类变量,图片文件夹的绝对路径
picture_paths = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'picture')
def read_picture(self):
""" 读取图片,并调用自身提取元数据方法 """
pictures = os.listdir(self.__class__.picture_paths)
for picture in pictures:
picture_path = os.path.join(self.picture_paths, picture)
self.get_picture_exif(picture_path)
def get_picture_exif(self, picture_name):
""" 提取图片元数据 """
img_file = open(picture_name, 'rb')
picture_info = exifread.process_file(img_file)
if picture_info:
for tag, value in picture_info.items():
print(f'{tag}:{value}')
print('*' * 150)
print(picture_name)
GPSLatitude = picture_info['GPS GPSLatitude'] # 纬度数
GPSLatitudeRef = picture_info['GPS GPSLatitudeRef'] # N,S 南北纬
GPSLongitude = picture_info['GPS GPSLongitude'] # 经度数
GPSLongitudeRef = picture_info['GPS GPSLongitudeRef'] # E,W 东西经
GPSDate = picture_info['EXIF DateTimeOriginal'] # 拍摄时间
if GPSLatitude and GPSLongitude and GPSDate:
print(f'纬度:{GPSLatitudeRef}{GPSLatitude}\n精度:{GPSLongitudeRef}{GPSLongitude}\n拍摄时间:{GPSDate}\n')
latitude = self.deal_data_format(GPSLatitude)
longitude = self.deal_data_format(GPSLongitude)
print(f'处理后的经纬度:【{GPSLatitudeRef}{latitude},{GPSLongitudeRef}{longitude}】')
else:
print('请检查提取的图片是否为原图,若为原图,则说明无相关元数据!')
def deal_data_format(self, data):
""" 处理数据,清洗格式生成对应内容 """
data_list_tmp = str(data).replace('[', '').replace(']', '').split(',')
data_list = [data.strip() for data in data_list_tmp]
data_tmp = data_list[-1].split('/')
data_list[-1] = str(int(data_tmp[0]) / int(data_tmp[1]))
# 为了适配gps定位网站的规格输出,将列表做成度分时的状态
data_list.insert(1,'°')
data_list.insert(3,'′′')
data_str = ''.join(data_list)
return data_str
def main():
metaPicture = MetaPicture()
metaPicture.read_picture()
main()
欢迎留下你的看法
共 0 条评论