【Python】Pillowで画像のExif情報(撮影日時・カメラモデルなど)を読み込む

スマートフォンやデジタルカメラで撮影した写真(JPEG画像)には、撮影日時、カメラの機種、絞り値、ISO感度などのメタデータである Exif(Exchangeable Image File Format) 情報が含まれています。

PythonのPillowライブラリを使えば、これらの情報を簡単に取得・解析できます。タグID(数値)のままでは内容がわからないため、PIL.ExifTags.TAGS 辞書を使って人間が読める項目名に変換するのが一般的です。

目次

実行可能なサンプルコード

以下のコードは、画像からExif情報を取得し、項目名と値を一覧表示するスクリプトです。

ユーザーのコードにあったタイプミス(~ や items) など)を修正し、Exif情報が存在しない場合のエラーハンドリングを追加しています。

※Exif情報は、SNSにアップロードされた画像や、画像編集ソフトで保存し直した画像では削除されている場合が多いのでご注意ください。

from PIL import Image
from PIL.ExifTags import TAGS
import os

def read_exif_data():
    filename = "photo_with_exif.jpg"

    # 動作確認用にダミー画像を作成する機能はありません(Exifをプログラムで正しく書くのは複雑なため)。
    # お手持ちのスマートフォンで撮影した写真などを指定してください。
    if not os.path.exists(filename):
        print(f"警告: ファイル '{filename}' が見つかりません。")
        print("お手持ちのJPEG写真のファイルパスに書き換えて実行してください。")
        return

    try:
        with Image.open(filename) as img:
            print(f"Loading: {filename}")
            
            # getexif() メソッドでExifデータを取得します
            # ※古いコードでは _getexif() が使われていましたが、現在は getexif() が推奨されます
            exif_data = img.getexif()

            if not exif_data:
                print("この画像にはExif情報が含まれていません。")
                return

            print("\n--- Exif Information ---")
            
            # Exifデータは {タグID: 値} の辞書形式です
            for tag_id, value in exif_data.items():
                # タグIDを人間が読めるタグ名(文字列)に変換
                # TAGSに含まれていないメーカー独自タグなどはIDのまま表示
                tag_name = TAGS.get(tag_id, tag_id)
                
                # 見やすく整形して表示
                # (バイナリデータなど長すぎる値は省略すると見やすくなります)
                if isinstance(value, bytes) and len(value) > 20:
                    value = f"<Bytes Data: {len(value)} bytes>"
                
                print(f"{tag_name:25}: {value}")

            # 特定の情報を取得したい場合の例(DateTimeなど)
            # 306 は 'DateTime' のタグIDです
            print("\n[Specific Data]")
            date_taken = exif_data.get(306)
            print(f"撮影日時: {date_taken}")

    except Exception as e:
        print(f"エラーが発生しました: {e}")

if __name__ == "__main__":
    read_exif_data()

解説:Exif取得のポイント

1. image.getexif()

画像ファイルからExifヘッダー情報を読み込み、Image.Exif オブジェクト(辞書のように振る舞います)を返します。

以前は _getexif() という内部メソッドを使う例が多かったですが、現在のPillowでは getexif() が標準的なアクセサです。

2. TAGS 辞書による変換

Exifデータの実体は、「数値のID」と「値」のペアです(例: 306: ‘2025:01:03 12:00:00’)。

これでは 306 が何を意味するかわからないため、PIL.ExifTags.TAGS を使ってマッピングします。

from PIL.ExifTags import TAGS
tag_name = TAGS.get(306) # -> 'DateTime'

3. 主なExifタグID

よく利用されるタグのIDと名前の例です。

タグIDタグ名 (TAGS.get)内容
271Makeカメラメーカー (例: Apple, Canon)
272Modelカメラモデル (例: iPhone 13)
306DateTime撮影日時 (例: 2023:10:01 10:20:30)
33434ExposureTime露出時間・シャッタースピード (例: 1/60)
34853GPSInfoGPS情報(※ここはさらにデコードが必要な複雑な構造です)
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次