Python Tips: 画像の Exif データを取得したい

追記: こちらは Python 2 を対象とした記事です。 Python 3 に関する情報は末尾に少しだけ載せている ので、そちらに興味のある方は記事の末尾まで読み飛ばしてください。

Pythonを使って画像の Exif データを取得する方法をご紹介します。

Exif とは Exchangeable Image File Format の略で、画像のメタ情報を表すデータフォーマットです。写真であれば、カメラの機種や撮影した日付、位置情報などのデータを格納することができます。

Exif 情報は必ずしもすべての画像ファイルに備わっているわけではありません。 また、 Exif 情報がある場合でも、カメラの機材やアプリによってその中にどんな情報を格納するのかは異なります。

この Exif データを Python を使って取得する方法を以下ご紹介します。

結論からいえば、有名な画像ライブラリ PIL を使う方法がかんたんです。

pip install PIL

コードを見てみます。

# ライブラリ読み込み
from PIL import Image
from PIL.ExifTags import TAGS

# 関数の定義 01
def get_exif_of_image(file):
    """Get EXIF of an image if exists.

    指定した画像のEXIFデータを取り出す関数
    @return exif_table Exif データを格納した辞書
    """
    im = Image.open(file)

    # Exif データを取得
    # 存在しなければそのまま終了 空の辞書を返す
    try:
        exif = im._getexif()
    except AttributeError:
        return {}

    # タグIDそのままでは人が読めないのでデコードして
    # テーブルに格納する
    exif_table = {}
    for tag_id, value in exif.items():
        tag = TAGS.get(tag_id, tag_id)
        exif_table[tag] = value

    return exif_table

print get_exif_of_image("sample.jpg")
# => Exif 情報を格納した辞書
#    Exif 情報がない場合には空の辞書

まずは PIL から画像ファイルを開くための Image クラスと Exif 情報を読み取るための TAGS という dict を読み込みます。

次に、これらを使って実際に画像を読み込み Exif データを取得します。 Exif データは Image クラスの _getexif() メソッドで取得できます。

上で定義した get_exif_of_image() に画像ファイル名を渡すと、その情報を返してくれるはずです。

Exif データのうち日付情報だけを取り出したい場合は次のようにします。

# 関数の定義 02
def get_date_of_image(file):
    """Get date date of an image if exists

    指定した画像の Exif データのうち日付データを取り出す関数
    @return yyyy:mm:dd HH:MM:SS 形式の文字列
    """

    # get_exif_of_imageの戻り値のうち
    # 日付データのみを取得して返す
    exif_table = get_exif_of_image(file)
    return exif_table.get("DateTimeOriginal")

print get_date_of_image("sample.jpg")
# => yyyy:mm:dd HH:MM:DD 形式の文字列
#    Exif データが存在しない場合は None

作成日時の情報は DateTimeOriginal という名前で扱われるのでここではその値を取得しています(ファイルによっては DateTimeOriginal がセットされておらず、代わりに変更日時を表す DateTime だけがセットされていたりすることもあります)。

以上です。

参考

追記: Python 3 の場合

Python 3 の場合は PIL のフォークとして作られた Pillow ライブラリを使う方法が一般的なようです。

python3 -m pip install Pillow

Pillow のバージョン 8.x で確認したところ、 PIL にあった _getexif() に加えて getexif() というメソッドが利用できました。

from PIL import Image
from PIL.ExifTags import TAGS


def print_exif_items(exif):
    for k, v in exif.items():
        print(f'{TAGS.get(k, k)}: {v}')


with Image.open("sample.jpg") as im:
    exif = im.getexif()

print_exif_items(exif)
# =>
# ResolutionUnit: 2
# ExifOffset: 192
# ImageDescription: xxx
# Make: xxx
# Model: xxx
# Orientation: 1
# DateTime: 2021:02:07 14:35:15
# YCbCrPositioning: 1
# XResolution: 72.0
# YResolution: 72.0

余談です。 Exif は世界的に広く使われている規格ですが、 Wikipedia によると日本の電子情報技術産業協会( JEITA )が作成した日本発のものだそうです。 追記時( 2021 年)の最新版は 2019 年 5 月の 2.32 (規格名称「 CIPA DC-008-2019 」)です。 Exif の詳細に興味のある方はカメラ映像機器工業会( CIPA )の資料をご覧になるとよいかと思います: