CodeGym /课程 /Python SELF ZH /处理元数据

处理元数据

Python SELF ZH
第 46 级, 课程 3
可用

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元数据包含拍摄参数信息,可以用于分析照片和创建报告。
  • 编辑后保留元数据:编辑图片时可以保留原始拍摄参数,这对归档和文档化很有用。
1
任务
Python SELF ZH, 第 46 级, 课程 3
已锁定
从图像中提取EXIF数据
从图像中提取EXIF数据
2
任务
Python SELF ZH, 第 46 级, 课程 3
已锁定
保存和优化带有EXIF数据的图像
保存和优化带有EXIF数据的图像
4
任务
Python SELF ZH, 第 46 级, 课程 3
已锁定
基于EXIF数据的图像处理自动化
基于EXIF数据的图像处理自动化
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION