2014/12/03

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

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

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

必ずしもすべての画像に備わっているわけではないので、「ついてる画像にはついてる」といった位置づけの情報です。

ちなみに Exif は Exchangeable Image File Format の略だとか。


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

結論からいえば、 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 という辞書を読み込みます。

次に、これらを使って実際に画像を読み込み Exif データを取得します。 PIL を使えば、 Exif データは _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

上の get_exif_of_image 関数の方で例外処理なんかはしてあるので、こちらの関数ではその戻り値から日付情報を抜き出すだけです。

PIL の場合、日付情報は DateTimeOriginal という名前で扱われるので、これをキーとしてそのまま指定しています。


以上です。

使いどころとしては、画像ファイルの名前のフォーマットを統一したい場合などでしょうか。カメラを複数台使っている場合なんかには、画像ファイルの名前が機種ごとにまちまちだったりするので、それを統一するときなんかには便利だと思います。

あとは、カメラの使用日時を統計データとしてまとめたいとき、なんかでしょうか。


参考
Extracting image EXIF data with Python | Endlessly Curious
In Python, how do I read the exif data for an image? - Stack Overflow
How do I use Python's PIL library to get EXIF data from a photo starting with a hyperlink to the photo? - Stack Overflow

Exchangeable image file format - Wikipedia

0 件のコメント: