当前位置: 首页 > 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.lqws.cn/news/160309.html

相关文章:

  • 炫云:为驱动数字视觉产业升级保驾护航
  • 解锁Java线程池:性能优化的关键
  • 八皇后问题深度解析
  • 11 - ArcGIS For JavaScript -- 高程分析
  • 图像分类进阶:从基础到专业 (superior哥AI系列第10期)
  • 窗口聚合窗口聚合
  • 倍福 PLC程序解读
  • NLP驱动网页数据分类与抽取实战
  • Linux(12)——基础IO(下)
  • YOLO在QT中的完整训练、验证与部署方案
  • TIA博途中的程序导出为PDF格式的具体方法示例
  • 系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
  • tcp/udp
  • 网页前端开发(基础进阶4--axios)
  • Neo4j 完全指南:从入门到精通
  • js 比较两个对象的值,不相等就push对象的key
  • 平台升级:新功能与新模型震撼登场!
  • 华硕电脑,全新的超频方式,无需进入BIOS
  • uniapp实现的简约美观的星级评分组件
  • rust或tauri项目执行命令的时候,cmd窗口也会弹出显示解决方法
  • OpenCV 图像通道的分离与合并
  • Windows+Cmake编译Opencv-python
  • 【数据结构】树形结构--二叉树(二)
  • docker 搭建php 开发环境 添加扩展redis、swoole、xdebug(2)
  • Palo Alto Networks Expedition存在命令注入漏洞(CVE-2025-0107)
  • nodejs里面的http模块介绍和使用
  • Ubuntu系统配置C++的boost库(含filesystem模块)的方法
  • ASP.NET Core使用Quartz部署到IIS资源自动被回收解决方案
  • 【.net core】.KMZ文件解压为.KML文件并解析为GEOJSON坐标数据集。附KML处理多线(LineString)闭环问题
  • 37.第二阶段x64游戏实战-封包-寻找Socket套接字