Pillow ExifTags 模块
ExifTags 是 Python Pillow 图像处理库中的一个子模块,专门用于处理图像中的 EXIF(Exchangeable Image File Format)元数据。
EXIF 数据是嵌入在图像文件中的额外信息,通常包含拍摄设备、拍摄参数(如光圈、快门速度)、GPS 位置等信息。
导入 ExifTags:
from PIL import Image, ExifTags
为什么需要 ExifTags 模块
- 读取图像元数据:了解图像的拍摄信息和属性
- 图像处理:基于 EXIF 数据进行图像处理(如自动旋转)
- 数据分析:批量分析照片的拍摄参数
- 隐私保护:查看或删除敏感的位置信息
ExifTags 模块主要方法
下表列出了 ExifTags 模块中最常用的方法和属性:
方法/属性 | 描述 | 返回值类型 | 示例 |
---|---|---|---|
TAGS |
包含所有标准 EXIF 标签ID到名称的映射字典 | dict | {256: 'ImageWidth', 257: 'ImageLength'} |
GPSTAGS |
包含所有GPS相关EXIF标签ID到名称的映射字典 | dict | {0: 'GPSVersionID', 1: 'GPSLatitudeRef'} |
get(tag_id) |
根据标签ID获取标签名称 | str | ExifTags.get(36867) → 'DateTimeOriginal' |
getid(tag_name) |
根据标签名称获取标签ID | int | ExifTags.getid('DateTimeOriginal') → 36867 |
使用示例
1. 查看所有 EXIF 标签
实例
from PIL import Image, ExifTags
# 打印所有标准EXIF标签
for tag_id in ExifTags.TAGS:
tag_name = ExifTags.TAGS[tag_id]
print(f"ID: {tag_id}, Name: {tag_name}")
# 打印所有标准EXIF标签
for tag_id in ExifTags.TAGS:
tag_name = ExifTags.TAGS[tag_id]
print(f"ID: {tag_id}, Name: {tag_name}")
2. 读取图像的 EXIF 数据
实例
from PIL import Image, ExifTags
image = Image.open("example.jpg")
# 获取EXIF数据
exif_data = image._getexif()
if exif_data:
for tag_id, value in exif_data.items():
# 获取标签名称
tag_name = ExifTags.TAGS.get(tag_id, tag_id)
print(f"{tag_name:25}: {value}")
else:
print("该图像没有EXIF数据")
image = Image.open("example.jpg")
# 获取EXIF数据
exif_data = image._getexif()
if exif_data:
for tag_id, value in exif_data.items():
# 获取标签名称
tag_name = ExifTags.TAGS.get(tag_id, tag_id)
print(f"{tag_name:25}: {value}")
else:
print("该图像没有EXIF数据")
3. 处理 GPS 信息
实例
from PIL import Image, ExifTags
image = Image.open("with_gps.jpg")
exif_data = image._getexif()
if exif_data:
# 获取GPS信息
gps_info = {}
for tag_id in exif_data:
tag_name = ExifTags.TAGS.get(tag_id, tag_id)
if tag_name == "GPSInfo":
for gps_tag_id in exif_data[tag_id]:
gps_tag_name = ExifTags.GPSTAGS.get(gps_tag_id, gps_tag_id)
gps_info[gps_tag_name] = exif_data[tag_id][gps_tag_id]
print("GPS信息:", gps_info)
image = Image.open("with_gps.jpg")
exif_data = image._getexif()
if exif_data:
# 获取GPS信息
gps_info = {}
for tag_id in exif_data:
tag_name = ExifTags.TAGS.get(tag_id, tag_id)
if tag_name == "GPSInfo":
for gps_tag_id in exif_data[tag_id]:
gps_tag_name = ExifTags.GPSTAGS.get(gps_tag_id, gps_tag_id)
gps_info[gps_tag_name] = exif_data[tag_id][gps_tag_id]
print("GPS信息:", gps_info)
常见 EXIF 标签
以下是几个常用的 EXIF 标签及其 ID:
标签ID | 标签名称 | 描述 |
---|---|---|
271 | Make | 相机制造商 |
272 | Model | 相机型号 |
274 | Orientation | 图像方向 |
282 | XResolution | 水平分辨率 |
283 | YResolution | 垂直分辨率 |
296 | ResolutionUnit | 分辨率单位 |
306 | DateTime | 修改日期和时间 |
36867 | DateTimeOriginal | 原始拍摄时间 |
36868 | DateTimeDigitized | 数字化时间 |
33434 | ExposureTime | 曝光时间 |
33437 | FNumber | 光圈值 |
注意事项
- 不是所有图像都有 EXIF 数据:有些图像可能被处理过,移除了 EXIF 信息
- 隐私问题:GPS 位置信息可能泄露隐私,分享图片前应考虑删除
- 写入限制:Pillow 对 EXIF 数据的写入支持有限,可能需要其他库进行复杂操作
- 数据类型:EXIF 数据中的值可能是各种类型(字符串、元组、有理数等)
通过掌握 ExifTags 模块,你可以轻松地访问和处理图像中的元数据,为图像处理和分析提供更多可能性。
点我分享笔记