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() メソッドで取得することができます。
getexifof_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
上の getexifof_image 関数の方で例外処理なんかはしてあるので、こちらの関数ではその戻り値から日付情報を抜き出すだけです。
PIL の場合、日付情報は DateTimeOriginal という名前で扱われるので、これをキーとしてそのまま指定しています。
以上です。
使いどころとしては、画像ファイルの名前のフォーマットを統一したい場合などでしょうか。カメラを複数台使っている場合なんかには、画像ファイルの名前が機種ごとにまちまちだったりするので、それを統一するときなんかには便利だと思います。
あとは、カメラの使用日時を統計データとしてまとめたいとき、なんかでしょうか。