1. 處理 EXIF 元數據
EXIF 元數據儲存了圖片的屬性資訊,比如拍攝參數(ISO、快門速度、光圈)、創建日期、方向,甚至地理座標位置。EXIF 數據可以被提取,用於分析圖片或自動化處理。
提取 EXIF 數據
可以使用 info 或 getexif() 屬性來提取 EXIF 元數據。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 元數據通常包含拍攝參數,比如解析度、方向和地理位置信息。下面展示如何從 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 數據的支持有限,但如果圖片的原始 EXIF 數據已存在,可以在轉換圖片時保留這些數據。
範例: 轉換時保留元數據
在保存圖片時,使用 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 格式與元數據的實際應用
- 網頁圖片優化: 將圖片轉換為優化格式(例如 JPEG 和 PNG),能減少文件大小,加速網頁加載。
- 報告數據分析: EXIF 元數據包含拍攝參數資訊,這些信息對圖片分析和報告生成非常有用。
- 保持元數據完整性: 在圖片編輯時可以保留原始拍攝參數,適合用於檔案管理和記錄。
GO TO FULL VERSION