追記: こちらは 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
だけがセットされていたりすることもあります)。
以上です。
参考
- 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
追記: 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 )の資料をご覧になるとよいかと思います: