当前位置: 首页 > news >正文

使用Python提取照片元数据:方法与实战指南

## 引言:元数据的重要性

照片元数据(Metadata)是嵌入在图像文件中的隐藏信息,记录了拍摄设备、时间、地理位置、光圈快门参数等关键数据。这些信息广泛应用于**数字取证**、**照片管理**、**地理标记分析**和**版权验证**等场景。本文将介绍Python中三种主流元数据提取方法,并提供完整的代码实现。

---

## 一、使用Pillow库提取基础EXIF数据

### 安装与基础操作

```bash

pip install Pillow

```

### 代码示例

```python

from PIL import Image

from PIL.ExifTags import TAGS

def get_exif_pillow(image_path):

try:

img = Image.open(image_path)

exif_data = img._getexif()

if exif_data:

return {

TAGS.get(tag_id, tag_id): value

for tag_id, value in exif_data.items()

}

except (AttributeError, OSError) as e:

print(f"Error: {e}")

return None

# 使用示例

metadata = get_exif_pillow("photo.jpg")

print("拍摄设备:", metadata.get("Model", "未知"))

print("拍摄时间:", metadata.get("DateTimeOriginal", "未记录"))

```

### 特点与局限

- **支持格式**:JPEG/TIFF等格式

- **数据范围**:仅提取EXIF标准字段

- **常见问题**:部分设备自定义标签无法解析

---

## 二、使用ExifRead进行精准解析

### 安装与高级解析

```bash

pip install exifread

```

### 代码示例

```python

import exifread

def get_exif_exifread(image_path):

with open(image_path, 'rb') as f:

tags = exifread.process_file(f, details=False)

return {

str(tag): str(value)

for tag, value in tags.items()

}

# 提取GPS坐标

metadata = get_exif_exifread("photo.jpg")

gps_latitude = metadata.get("GPS GPSLatitude", "").strip("[]").split(", ")

gps_longitude = metadata.get("GPS GPSLongitude", "").strip("[]").split(", ")

```

### 优势

- 支持原始十六进制数据解析

- 更完整的EXIF标签覆盖

- 可直接处理RAW格式文件(如.CR2/.NEF)

---

## 三、使用PyExifTool实现全能解析

### 安装与配置

```bash

pip install PyExifTool

# 需预先安装exiftool:https://exiftool.org/

```

### 代码示例

```python

import exiftool

def get_all_metadata(image_path):

with exiftool.ExifToolHelper() as et:

metadata = et.get_metadata(image_path)[0]

return {

key.split(":")[-1]: value

for key, value in metadata.items()

}

# 获取XMP和IPTC数据

full_data = get_all_metadata("photo.dng")

print("作者信息:", full_data.get("Creator", "未记录"))

print("版权声明:", full_data.get("Rights", "未标注"))

```

### 核心优势

- 支持**XMP**、**IPTC**、**ICC Profile**等多标准

- 可处理**视频文件**元数据

- 保留原始数据类型(非字符串)

---

## 四、GPS坐标转换实战

### 度分秒转十进制

```python

def dms_to_decimal(dms, ref):

degrees = dms[0].num / dms[0].den

minutes = dms[1].num / dms[1].den

seconds = dms[2].num / dms[2].den

decimal = degrees + minutes/60 + seconds/3600

return -decimal if ref in ["S", "W"] else decimal

# 使用ExifRead数据示例

lat = dms_to_decimal(metadata["GPS GPSLatitude"], metadata["GPS GPSLatitudeRef"])

lon = dms_to_decimal(metadata["GPS GPSLongitude"], metadata["GPS GPSLongitudeRef"])

print(f"坐标:{lat:.6f}, {lon:.6f}")

```

---

## 五、技术选型建议

| 方法 | 适用场景 | 性能 | 数据完整性 |

|-------------|----------------------------|--------|------------|

| Pillow | 快速获取基础拍摄信息 | ★★★★☆ | ★★☆☆☆ |

| ExifRead | 专业级EXIF解析 | ★★★☆☆ | ★★★★☆ |

| PyExifTool | 跨格式元数据提取 | ★★☆☆☆ | ★★★★★ |

---

## 六、注意事项

1. **隐私安全**:删除GPS标签可使用`exiftool -GPS*= image.jpg`

2. **文件保护**:操作前备份原始文件

3. **编码问题**:使用`chardet`库处理字符编码异常

http://www.xdnf.cn/news/884359.html

相关文章:

  • 【定昌linux开发板】关闭ssh 端口 22
  • Java详解LeetCode 热题 100(27):LeetCode 21. 合并两个有序链表(Merge Two Sorted Lists)详解
  • 短视频矩阵系统技术saas源头6年开发构架
  • 深入理解JavaScript设计模式之闭包与高阶函数
  • 【JVM】三色标记法原理
  • VisDrone无人机视觉挑战赛观察解析2025.6.5
  • 无人机避障与视觉跟踪技术分析!
  • 装备制造项目管理具备什么特征?如何选择适配的项目管理软件系统进行项目管控?
  • Spring Boot + Elasticsearch + HBase 构建海量数据搜索系统
  • 【数据分析】基于adonis2与pairwise.adonis2的群组差异分析教程
  • vue-router路由问题:可以通过$router.push()跳转,但刷新后又变成空白页面
  • Uniapp 二维码生成与解析完整教程
  • Spring IoC 详解:原理、实现与实战
  • 【Go语言基础【3】】变量、常量、值类型与引用类型
  • Excel处理控件Aspose.Cells教程:使用 C# 从 Excel 进行邮件合并
  • [Git] 文件删除
  • 五、查询处理和查询优化
  • 自动驾驶TPM技术杂谈 ———— 车辆安全设计思考维度
  • 中阳视角下的资产配置趋势分析与算法支持
  • 使用ArcPy进行栅格数据分析(2)
  • MPLAB X IDE ​软件安装与卸载
  • ocrapi服务docker镜像使用
  • 嵌入式学习笔记DAY33(网络编程——TCP)
  • 三格电子SG-UHF-80系列:工业自动化的超高频RFID革新力量
  • 软考 系统架构设计师系列知识点之杂项集萃(82)
  • 【Netty4核心原理⑧】【揭开Bootstrap的神秘面纱 - 服务端Bootstrap❶】
  • 计算机网络自顶向下期末复习:第一章
  • 3D模型格式转换工具HOOPS Exchange赋能大型资产建模平台:多源CAD数据访问与转换!
  • XDMA pcie环路测试
  • SQL SERVER中获取外部数据的两种方法!