1. 处理EXIF元数据
EXIF元数据保存了图片的属性信息,比如拍摄参数(ISO、快门速度、光圈)、创建日期、方向甚至拍摄地点的坐标。可以提取这些EXIF数据,用于分析图片或自动化处理。
提取EXIF数据
EXIF元数据可以通过info或者getexif()方法提取出来。getexif()方法可以访问图片中所有的EXIF元数据(如果存在)。
Python
# 提取EXIF数据
exif_data = image._getexif()
# 检查是否有EXIF数据
if exif_data is not None:
for tag_id, value in exif_data.items():
tag = Image.ExifTags.TAGS.get(tag_id, tag_id)
print(f"{tag}: {value}")
else:
print("未找到EXIF数据。")
在这个代码中,Image.ExifTags.TAGS被用来把EXIF标签的ID解码成可读的名称,比如"DateTime"、"ExposureTime"、"ISOSpeedRatings"等。如果图片没有EXIF数据,函数会输出一条信息。
2. 提取关键元数据
EXIF数据中经常包含拍摄参数,比如分辨率、方向和地理位置。我们来看如何提取其中一些值(如果存在)。
提取拍摄日期时间、分辨率和方向
Python
from PIL.ExifTags import TAGS
# 检查是否有EXIF数据
if exif_data is not None:
# 初始化存储值的变量
date_time = None
orientation = None
resolution = None
for tag_id, value in exif_data.items():
tag = TAGS.get(tag_id, tag_id)
# 根据标签提取数据
if tag == "DateTime":
date_time = value
elif tag == "Orientation":
orientation = value
elif tag == "XResolution" or tag == "YResolution":
resolution = value
print("拍摄日期和时间:", date_time)
print("方向:", orientation)
print("分辨率:", resolution)
else:
print("未找到EXIF数据。")
在这个例子中,提取了DateTime(拍摄日期和时间)、Orientation(图片方向)和XResolution/YResolution(图片分辨率)的值。这些数据通常在对照片进行分类或者创建报告时很有用。
3. 添加和编辑EXIF元数据
虽然Pillow对添加EXIF数据的支持有限,但如果源图片中已有元数据,可以在转换图片时保留这些元数据。
示例:转换时保留元数据
在保存图片时,通过save()方法的exif参数可以保留EXIF数据。
Python
# 检查是否有EXIF数据并保存
if exif_data is not None:
exif_bytes = image.info['exif']
image.save("converted_with_exif.jpg", exif=exif_bytes)
else:
print("没有EXIF数据。")
通过这个代码,在将图片转换为其他格式时仍能保留EXIF数据,从而保存拍摄时的原始参数。
4. 示例:
操作EXIF数据和格式的完整示例
最后,我们来看一个示例,该示例将图片转换、优化并保存EXIF数据。
Python
from PIL import Image, ExifTags
# 打开图片
image = Image.open("original.jpg")
# 检查是否有EXIF数据
exif_data = image._getexif()
if exif_data:
exif_bytes = image.info['exif'] # 保存EXIF数据以备后用
else:
print("没有EXIF数据。")
# 转换图片为PNG格式并优化
image_png = image.convert("RGB")
image_png.save("optimized_image.png", optimize=True)
# 转换为JPEG格式,减少质量并保留EXIF数据
if exif_data:
image.save("compressed_with_exif.jpg", quality=85, exif=exif_bytes)
else:
image.save("compressed_without_exif.jpg", quality=85)
这个代码包含:
- 将图片转换为PNG格式并优化。
- 将图片转换为JPEG格式,减少质量以优化文件大小。
- 在转换中保留EXIF数据(如果存在)。
处理EXIF元数据和格式的实际应用
- 优化图片用于Web:将图片转换为优化格式(如JPEG和PNG)可以减小文件大小,加快网页加载速度。
- 提取数据用于报告:EXIF元数据包含拍摄参数信息,可以用于分析照片和创建报告。
- 编辑后保留元数据:编辑图片时可以保留原始拍摄参数,这对归档和文档化很有用。
GO TO FULL VERSION