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()

 

发表评论

邮箱地址不会被公开。 必填项已用*标注