よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

【Pillow】スマホで画像情報EXIFの取得テスト

はじめに  


画像ファイルには、GPSや撮影日時、カメラのメーカーや機種、ストロボの設定などの情報が埋め込まれております。
これをEXIF情報というそうですが、Pythonを使ってEXIFを取得したり編集したりできるのだとか。  

EXIFを取得できれば、撮影場所(GPSをONで撮影したもののみ)や撮影日別など条件に合わせて画像が取得できたり、それぞれをフォルダ毎に振り分けたりが出来そうです。  


  今回はそのEXIFを取得します。 写経。
何のオリジナリティの欠片もなくスマホで動くかの実験のみ。  

  写経の経典はこちら

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

ありがたやありがたや。(^人^)<(_ _*)>

記載されたコードはPython2で書かれているようなので、print関数に()を付け加えました。   その他、少しだけ手を加えております。    

作業環境  


Androidスマホ ソニー
Pydroid3(python3.7)
Jupyter Notebook
外部モジュール Pillow
 

※ QpythonではPillowのインストールができませんでした。



目次  




モジュールのインストール  


画像を扱う外部モジュールのPillowを使用しますのでインストールが必要です。

pip install pillow  



EXIFの取得  


情報取得部分は関数で書かれてあります。


  • スマホのカメラで撮影した画像の保存フォルダ内のJPGファイルをリストで全取得し、  
  • 画像の枚数を出力し、  
  • そのリスト中の1枚目だけEXIF情報を取り出す。  

実行すると長いEXIF情報がブワーッと出ます。

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


# 関数の定義 01
def get_exif(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


######## 実行 ########
import glob

# スマホのカメラ画像保存フォルダ内のJPG全取得
pic_lst = glob.glob("/storage/emulated/0/DCIM/100ANDRO/*.JPG")

# JPG画像の枚数を取得
print("画像数",len(pic_lst))


# 読み取る画像(リストの一枚目だけ)
pic = pic_lst[0]

# EXIF情報の出力
# (注意! 辞書データを大量に吐き出します)
print(get_exif(pic))

# => Exif 情報を格納した辞書
#    Exif 情報がない場合には空の辞書
画像数 423
 {'GPSInfo': {}, 'ResolutionUnit': 2, 'ExifOffset': 220, 'Make': 'Sony', 'Model': 

=== 略 ===

}



撮影日時のみ取得  


カメラ画像保存フォルダ内の1枚目画像からEXIF情報の撮影日時を取り出す。

# 関数の定義 02
def get_date_EXIF(file):
    """Get 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_EXIF(pic))
# => yyyy:mm:dd HH:MM:DD 形式の文字列
#    Exif データが存在しない場合は None
2019:09:10 15:01:58


撮影日時の取得ができた。

おわりに


画像をsnsに上げたりクラウドに保存すれば、これらの情報はサーバー側が収集し、分析されている訳です。
行動パターンの分析やプロファイルを作るのも簡単でしょう。

あまり気持ちのよいものではないな…

その他  


関連ページ