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 等。

相关推荐
Yvonne爱编码5 分钟前
后端编程开发路径:从入门到精通的系统性探索
java·前端·后端·python·sql·go
lljss202025 分钟前
C# 每个chartArea显示最小值、平均值、最大值
开发语言·c#
yzpyzp38 分钟前
kotlin的函数前面增加suspend关键字的作用
android·开发语言·kotlin
jiet_h40 分钟前
Android Kotlin ObjectAnimator 和 ValueAnimator 全面解析
android·开发语言·kotlin
Q_Q196328847541 分钟前
python+springboot大学生心理测评与分析系统 心理问卷测试 自动评分分析 可视化反馈系统
开发语言·spring boot·python·django·flask·node.js·php
BYSJMG43 分钟前
计算机毕设推荐:基于Hadoop+Spark物联网网络安全数据分析系统 物联网威胁分析系统【源码+文档+调试】
大数据·hadoop·python·物联网·spark·django·课程设计
Android技术之家44 分钟前
Kotlin与Compose:Android开发的现代化变革
android·java·开发语言·kotlin
十八旬1 小时前
【超简单】后端入门案例-基于SpringBoot+MyBatis-plus+MySQL图书管理系统
java·开发语言·idea·intellij idea·项目实战
0_0梅伊阁诗人1 小时前
Redis
开发语言·笔记·python