撮影した写真のデータを可視化する方法、または写真をメモとして使い倒す方法。by Python
はじめに
世界のiPhone累積販売台数は、2018年1月の時点で10億台を超えているそうです。私は写真はこだわって撮っている方ですが、数年前からデジタル一眼には興味が失せてしまい、もっぱらiPhoneで撮るか、あとはフィルムカメラです。iPhoneで撮る理由は、解像度や画質が上がっていることも有りますが、一回の撮影で沢山の情報を残せることが1番の理由です。多くの人は、ホワイトボードやお店の看板、授業の参考情報なんかiPhoneの写真をメモとして使っていると思います。
ただ、写真をメモとして活用する場合
1 SNSやBlogに貼る
2 標準の写真アプリで見る
3 Office系のアプリに貼る(PPT/WORD/EXCEL)
だいたいこのパターンかと思います。
私の場合、iPhoneで撮影した写真が膨大にストックされているのですが、メモや記録として撮影することも多く、いつどこで撮影した写真なのか毎回アプリで検索するのが面倒でした。また記録ではなく写真活動として、出張の折に新幹線から富士山を撮影することを何年も続けているのでこれを作品としてまとめたいと思っていました。そこでいっそのこと自分でiPhoneで撮影した写真から欲しい情報を取り出し写真メモに自動変換するツールを自分で作ってやろう(Pythonも書いてみたかったので)と思い実際に作れてしまったので、そのサンプルコードを公開することにしました。
この記事想定読者
Pythonはスクリプト言語なので、プログラミング初心者の方でも少しずつ試しながら実行できるかと思います
確認環境
前置きが長くなりましたが、この記事は写真に含まれるEXIF情報を使って写真をメモとして使い倒す方法を考えたいと思います。ツールとしてライブラリが揃っていそうなPythonを使いますが他のツール(言語)でも実装はできると思います。
対象となる環境(確認した環境)は
・Python 3.5.1
・mac os Mojave 10.14 (Sieraでも動くと思います)
・ iPhone 4s/7
です。Windowsでも動くと思いますが試していません。
蛇足ですが、私が公開している本日の富士さん2017はこのツールで作成した画像を利用しています。
このツール(サンプルコード)でやったこと
今回紹介するサンプルコードでは以下を実現しますが、EXIFに含まれるその他の撮影データもサンプルコードを参考に修正してもらえれば表示できると思います。もちろん位置情報が写真に含まれていなければ地名や地図の表示はできません。
・撮影時のカメラの向きに合わせて写真を回転させる。
・撮影日時を表示する
・カメラ(携帯)の機種を表示する
・地名を表示(大凡になります)
・地図を表示(これも大凡になります)
撮影からの流れ(使い方)
まず、 iPhoneの標準カメラアプリで撮影します。(この際写真にGPSの位置情報を残す設定をしておいて下さい)。撮影した写真をmacやPCに取り込みツール内で指定するフォルダに写真をコピーします。最後にツールを実行すると写真から取り出したEXIFを元に撮影メモが作成されます。GPSの位置情報がついていれば、付近の地図画像も一緒に貼り付けます。
ツールで使っているPythonライブラリ
今回Pythonで使っている(importしている)ライブラリの一覧です。
これ見れば、分かる人は有料部分の記事を見なくても自力で同じようなことはできると思います。
import smopy
import os
from PIL import Image, ImageDraw, ImageFilter, ExifTags, ImageFont
from geopy.geocoders import Nominatim
from PIL.ExifTags import TAGS, GPSTAGS
特に今回キモになるのはこの二つのライブラリです。インストールはpip経由でインストールしました。
smopyはOpenStreetMapのイメージタイルを取得するライブラリです。
インストールなど詳細はこちらから。
Name: smopy
Version: 0.0.6
Summary: OpenStreetMap image tiles in Python
Home-page: http://packages.python.org/smopy
Author: Cyrille Rossant
Author-email: rossant@github
License: BSD
Location: /Users/shoji/.pyenv/versions/anaconda3-2.5.0/lib/python3.5/site-packages
Requires: pillow, ipython, numpy, six, matplotlib
Required-by:
GeoPyは位置情報に関するウエブサービス(Geo Coding)サイトのクライアントになってくれるライブラリです。
インストールなど詳細はこちらから。
Name: geopy
Version: 1.14.0
Summary: Python Geocoding Toolbox
Home-page: https://github.com/geopy/geopy
Author: GeoPy Contributors
Author-email: uijllji@gmail.com
License: MIT
Location: /Users/shoji/.pyenv/versions/anaconda3-2.5.0/lib/python3.5/site-packages
Requires: geographiclib
Required-by:
処理の流れ
大まかな処理の流れは以下のようになっています
1) 写真の格納フォルダを設定から読み込み、一つずつファイルを開く。
2) 開いた写真をからEXIF情報を抽出してメモリに保存する
3) EXIF保存時にカメラの向き(rotation)情報があれば、それに合わせて画像を回転させる
4) EXIF保存時にGPSデータがあれば、GPSを元に地名と周辺の地図データを取得する
5) 新しいイメージデータ(白紙の画像)を作成する
6) 白紙の画像に回転した写真の画像を貼り付ける
7) 保存したEXIFデータ(カメラデータ、撮影日時など)をテキストで6)に書き込む
8) 3)で取得した地図画像を6)に貼り付ける
9) ファイル保存時に撮影時の日付毎にフォルダを作成して保存する(2018/12/01追記)
免責事項
この後のサンプルコードを実行しても期待した通り動かないこともあるかもしれません。申し訳ありませんが、その場合こちらではサポートはできない(動作の保証はできない)ことをご了承ください。あくまで参考かつサンプルコードと思って活用頂けたらと思います。
サンプルコード説明
1) 写真の格納フォルダを設定から読み込み、一つずつファイルを開く。
155行目のconvert_files内でターゲットとなる写真格納フォルダのパスを渡して95行目でフォルダ内のファイルを順次読み出しています。
159 def main():
160 try:
161 for taginfo in convert_files(target_path):
162 continue
163 # print(taginfo)
164 except Exception as e:
165 print("[ERR]"+target_path , e.args)
166 pass
93 #convert files
94 def convert_files(dir):
95 for file in os.listdir(dir):
96 #prepare files
97 try:
2) 開いた写真をからEXIF情報を抽出してメモリに保存する
38行目で開いたイメージファイルハンドラ(imgfh)を使って41行目でexifを読み込む。45行目、46行目でtagを抽出する。
33 def get_exif_data(image_path):
34 print("get_exif_data_"+image_path)
35 geolocator = Nominatim()
36 exifs = []
37 rotate = 0
38 with Image.open(image_path) as imgfh:
39 try:
40 map = []
41 exif = imgfh._getexif()
42 if not exif:
43 return exif
44
45 for attr, val in exif.items():
46 tag = ExifTags.TAGS.get(attr, attr)
ここから先は
¥ 100
Amazonギフトカード5,000円分が当たる
興味を持っていただき、ありがとうございます。 写真やコンピュータ、考えていることなど、ライフワークとして取り組んでいることを載せていくつもりです。 スキやコメント、サポートなど、とても励みになります。 サポートで得たものはノート作成を維持する費用にします。 よろしくお願いします!