CodeGym /Javaコース /Python SELF JA /メタデータの操作

メタデータの操作

Python SELF JA
レベル 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データの追加を制限的にサポートしていますが、元の画像に既に含まれている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フォーマットとメタデータの実用的な用途

  • ウェブ用画像の最適化: 画像をJPEGやPNGなどの最適化された形式に変換することで、ファイルサイズを削減し、ページの読み込み速度を向上させます。
  • レポート用データの抽出: EXIFメタデータには撮影設定に関する情報が含まれており、写真の分析やレポート作成に役立ちます。
  • 編集時のメタデータの保持: 画像を編集する際、元の撮影設定を保持することで、アーカイブやドキュメント作成に役立ちます。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION