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 件のコメント:
コメントを投稿