1. EXIFメタデータの操作
EXIFメタデータには、撮影設定(ISO、シャッタースピード、絞り値)、作成日、画像の向き、撮影場所の座標など、画像の特性に関する情報が含まれています。EXIFデータは抽出して画像の分析や自動処理に活用できます。
EXIFデータの抽出
EXIFメタデータはinfo
またはgetexif()
を使用して抽出できます。getexif()
メソッドは、画像内にEXIFデータが存在する場合、その完全なセットへのアクセスを提供します。
# 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メタデータには、解像度、向き、位置情報など、撮影設定が頻繁に含まれます。これらの値を、データに存在する場合に抽出する方法を見てみましょう。
撮影日時、解像度、向きの抽出
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データを変換時に保持することは可能です。
例: 変換時のメタデータの保持
画像を保存する際、save()
メソッドのexif
パラメータを使用してEXIFデータを保持できます。
# 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データを保存する完全な例を見てみましょう。
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