Python中exifread库使用

目录

简要介绍

库的安装

使用案例

常见问题


简要介绍

exifread 是一个用于读取图像文件 EXIF 元数据的 Python 库,能够提取图片的隐藏信息,包括经纬度、拍摄时间等信息。

库的安装

使用exifread库首先要确保已经安装

python 复制代码
pip install exifread

使用案例

python 复制代码
import exifread
from datetime import datetime

def extract_exif_data(image_path):
    with open(image_path, 'rb') as f:# 打开图像文件(二进制模式)
        tags = exifread.process_file(f)# 读取 EXIF 数据
        exif_data = {# 提取时间和经纬度信息
        'DateTime': None,
        'Latitude': None,
        'Longitude': None
    }
        
    if 'Image DateTime' in tags:# 提取拍摄时间
        exif_data['DateTime'] = str(tags['Image DateTime'])
        
    if 'GPS GPSLatitude' in tags and 'GPS GPSLongitude' in tags: # 提取经纬度信息
        latitude = tags['GPS GPSLatitude'].values
        longitude = tags['GPS GPSLongitude'].values
        
        try:# 转换经纬度格式
            exif_data['Latitude'] = convert_to_degrees(latitude)
            exif_data['Longitude'] = convert_to_degrees(longitude)
        except ZeroDivisionError:
            print("Warning: Division by zero detected in GPS data.")
            exif_data['Latitude'] = None
            exif_data['Longitude'] = None
            
    return exif_data
def convert_to_degrees(values):
    # 将 EXIF 的经纬度格式转换为十进制度数
    d = float(values[0].num) / float(values[0].den)
    m = float(values[1].num) / float(values[1].den)
    s = float(values[2].num) / float(values[2].den)
    
    # 检查分母是否为零
    if values[0].den == 0 or values[1].den == 0 or values[2].den == 0:
        raise ZeroDivisionError("Division by zero detected in GPS data.")
    return d + (m / 60.0) + (s / 3600.0)

image_path = "FF.jpg"  #图片路径

exif_data = extract_exif_data(image_path)

print(f"拍摄时间: {exif_data['DateTime']}")
print(f"纬度: {exif_data['Latitude']}")
print(f"经度: {exif_data['Longitude']}")

解析:

  1. extract_exif_data 函数:该函数用于提取图片的 EXIF 数据,包括拍摄时间和经纬度信息。

  2. convert_to_degrees 函数:该函数用于将 EXIF 的经纬度格式(度、分、秒)转换为十进制度数。

常见问题

  • 在提取图片信息时可能遇到图片的经纬度提取不成功的情况

解决:

  1. 确保手机拍摄时打开GPS
  2. 传输方式
  • 不同的传输方式可能会影响 EXIF 数据的保留。

  • 通过社交媒体或云服务传输:许多社交媒体平台(如微信、QQ、微博等)和云服务(如 Google Drive、Dropbox 等)在传输图片时会压缩图片或移除 EXIF 数据以节省存储空间和带宽。

  • 通过邮件传输:邮件服务通常会压缩附件,这可能导致 EXIF 数据丢失。

  • 通过数据线直接传输:如果使用数据线直接将图片从手机传输到电脑,EXIF 数据通常会保留。

如何保留 EXIF 数据

为了确保图片的 EXIF 数据在传输过程中不被丢失,可以采取以下措施:

  1. 使用数据线直接传输:通过数据线直接将图片从手机传输到电脑,通常可以保留 EXIF 数据。

  2. 使用支持 EXIF 的传输工具:选择支持保留 EXIF 数据的传输工具,如一些专业的文件传输应用。

  3. 避免格式转换:尽量保持图片的原始格式(如 JPEG),避免转换为其他格式(如 PNG)。

  4. 使用支持 EXIF 的图片查看器和编辑器 :选择支持保留 EXIF 数据的图片查看器和编辑器,如 exiftoolImageMagick 等。

相关推荐
鱼子星_6 小时前
【C++】深入剖析list:list及其双向迭代器实现
开发语言·数据结构·c++·笔记·stl·list
脚踏实地皮皮晨6 小时前
003002004_WPF Panel 基类 官方类定义
开发语言·windows·算法·c#·wpf·visual studio
阿童木写作7 小时前
TikTok Shop视频翻译工具实战测评
人工智能·python·音视频
520拼好饭被践踏7 小时前
JAVA+Agent学习day25
java·开发语言·学习
大黄说说7 小时前
Java 并发大坑:volatile、synchronized、Lock 三者如何选择?
java·开发语言
魏码不凡7 小时前
CURL报错:未找到SSL证书文件问题
开发语言·php·ssl
circuitsosk7 小时前
大模型驱动的AI产品后端架构设计与实践
人工智能·python
JackSparrow4147 小时前
前端安全之JS混淆+请求加密+请求签名以提升爬虫难度
前端·javascript·后端·爬虫·python·安全
geovindu7 小时前
go:loghelper
开发语言·后端·golang
软糖姐姐7 小时前
python eureka服务发现_python与consul 实现gRPC服务注册-发现
python·consul·grpc·服务注册·发现