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

相关推荐
kkeeper~1 天前
0基础C语言积跬步之深入理解指针(5下)
c语言·开发语言
一直不明飞行1 天前
Java的equals(),hashCode()应该在什么时候重写
java·开发语言·jvm
2301_803934611 天前
Go语言如何做网络爬虫_Go语言爬虫开发教程【指南】
jvm·数据库·python
WL_Aurora1 天前
Python爬虫实战(六):新发地蔬菜价格数据采集.
爬虫·python
盲敲代码的阿豪1 天前
Python 入门基础教程(爬虫前置版)
开发语言·爬虫·python
basketball6161 天前
C++ 构造函数完全指南:从入门到进阶
java·开发语言·c++
互联科技报1 天前
2026超融合选型:Top5品牌与市场格局解读
开发语言·perl
weixin199701080161 天前
[特殊字符] 智能数据采集:数字化转型的“数据石油勘探队”(附Python实战源码)
开发语言·python
想唱rap1 天前
IO多路转接之poll
服务器·开发语言·数据库·c++
@杰克成1 天前
Java学习30
java·开发语言·学习