「写真のExif情報を確認したい」
「Exif情報をPythonで編集したい」
このような場合には、pyexiv2がオススメです。
この記事では、Exif情報の確認・編集ができるpyexiv2について解説しています。
本記事の内容
- pyexiv2とは?
- pyexiv2のシステム要件
- pyexiv2のインストール
- pyexiv2の動作確認
それでは、上記に沿って解説していきます。
pyexiv2とは?
pyexiv2とは、デジタル画像に埋め込まれたメタデータの読み書きが可能なPythonライブラリです。
デジタル画像の種類には、次の3つがあります。
- EXIF
- IPTC
- XMP
この記事では、Exifに絞って説明を行います。
Exifの読み取りだけであれば、次のライブラリで十分です。
しかし、上記ライブラリではExifの編集ができません。
よって、Exifの読み書き両方を処理するにはpyexiv2が必要となります。
以上、pyexiv2について説明しました。
次は、pyexiv2のシステム要件を説明します。
pyexiv2のシステム要件
現時点(2022年9月)でのpyexiv2の最新バージョンは、2.8.0となります。
この最新バージョンは、2022年8月19日にリリースされています。
サポートOSに関しては、以下を含むクロスプラットフォーム対応です。
- Windows
- macOS
- Linux(64bit)
サポート対象となるPythonのバージョンは、Python 3.5以降となります。
現状のPython公式開発サイクルは、以下。
バージョン | リリース日 | サポート期限 |
3.6 | 2016年12月23日 | 2021年12月23日 |
3.7 | 2018年6月27日 | 2023年6月27日 |
3.8 | 2019年10月14日 | 2024年10月 |
3.9 | 2020年10月5日 | 2025年10月 |
3.10 | 2021年10月4日 | 2026年10月 |
基本的には、上記開発サイクルに従った方が無難です。
よって、Python 3.7以降の利用を推奨しておきます。
あと、pyexiv2はExiv2のC++API経由でExifを操作します。
この関係上、ビルドする環境が必要かと考えてしまいます。
しかし、インストール時にビルドなどはしていません。
ビルドはせずに、必要なバイナリファイルをダウンロードしています。
Windowsの場合
Linuxの場合
pyexiv2のGitHubを見ると、OS・Python毎にバイナリが用意されていることを確認できます。
したがって、pyexiv2のシステム要件は非常にシンプルなモノだと言えます。
以上、pyexiv2のシステム要件を説明しました。
次は、pyexiv2のインストールを説明します。
pyexiv2のインストール
検証は、次のバージョンのPythonで行います。
$ python -V Python 3.10.2
まずは、現状のインストール済みパッケージを確認しておきます。
$ pip list Package Version ---------- ------- pip 22.2.2 setuptools 65.3.0 wheel 0.36.2
次にするべきことは、pipとsetuptoolsの更新です。
pipコマンドを使う場合、常に以下のコマンドを実行しておきましょう。
python -m pip install --upgrade pip setuptools
では、pyexiv2のインストールです。
pyexiv2のインストールは、以下のコマンドとなります。
pip install pyexiv2
pyexiv2のインストールは、一瞬で終わります。
終了したら、どんなパッケージがインストールされたのかを確認します。
$ pip list Package Version ---------- ------- pip 22.2.2 pyexiv2 2.8.0 setuptools 65.3.0 wheel 0.36.2
pyexiv2が依存するパッケージは、ありません。
その意味では、既存の環境にも容易に導入できそうです。
以上、pyexiv2のインストールを説明しました。
次は、pyexiv2の動作確認を説明します。
pyexiv2の動作確認
pyexiv2の動作確認を行います。
削除もありますが、今回は以下の動作を確認します。
- Exifの読み込み
- Exifの編集
動作確認を行う前に、Exif情報のある画像を用意しましょう。
ネットで探すよりは、自分で用意した方が確実に早いです。
それぞれを以下で説明します。
Exifの読み込み
Exifの読み込みは、以下のコードで行います。
「test.jpg」は、スマホで撮影した画像です。
import pyexiv2 import pprint IMG_PATH = "test.jpg" with pyexiv2.Image(IMG_PATH) as img: data = img.read_exif() print(type(data)) pprint.pprint(data)
with構文を使うと、close()を記述する手間を省くことができます。
with構文については、次の記事で解説しています。
上記コードを実行すると、次のような結果が表示されます。
<class 'dict'> {'Exif.Image.DateTime': '2022:09:03 09:31:49', 'Exif.Image.ExifTag': '243', 'Exif.Image.GPSTag': '978', 'Exif.Image.ImageLength': '3024', 'Exif.Image.ImageWidth': '4032', 'Exif.Image.Make': 'Google', 'Exif.Image.Model': 'Pixel 4a', 〜省略〜 'Exif.Thumbnail.Compression': '6', 'Exif.Thumbnail.ImageLength': '378', 'Exif.Thumbnail.ImageWidth': '504', 'Exif.Thumbnail.JPEGInterchangeFormat': '1333', 'Exif.Thumbnail.JPEGInterchangeFormatLength': '30402', 'Exif.Thumbnail.Orientation': '1', 'Exif.Thumbnail.ResolutionUnit': '2', 'Exif.Thumbnail.XResolution': '72/1', 'Exif.Thumbnail.YResolution': '72/1'}
戻り値となるデータは、辞書型「dict」になります。
Exif情報は、撮影デバイスやその設定により異なります。
なお、GPS関連の情報は除去しています。
GPS情報から、住所が判明することがありますからね。
Exif情報を公開する場合は、注意してください。
Exifの編集
Exifの編集は、項目(キー)の追加も含みます。
Exifの情報を変更するコードは、以下。
import pyexiv2 IMG_PATH = "test.jpg" with pyexiv2.Image(IMG_PATH) as img: img.modify_exif({'Exif.Image.Model': 'Pixel 6a'})
変更したいタグを指定して、値を設定します。
上記を実行して、エラーが出なければOKです。
確認のために、再度読み込みのコードを実行してみましょう。
〜省略〜 'Exif.Image.Make': 'Google', 'Exif.Image.Model': 'Pixel 6a', 'Exif.Image.Orientation': '1', 〜省略〜
「Pixel 4a」から「Pixel 6a」に変更できました。
ただ、Exifが全部表示されると見づらいです。
読み込み用コードを次のように変更すると、変更したタグの値のみを確認できます。
# pprint.pprint(data) print(data['Exif.Image.Model'])
コードを変更して、実行した結果は以下。
<class 'dict'> Pixel 6a
これで、見やすくなりました。
ここまでより、Exifの編集が簡単にできることがわかったはずです。
ただ、追加に関しては注意が必要になります。
with pyexiv2.Image(IMG_PATH) as img: img.modify_exif({'Exif.Image.Mytag': 'original tag'})
上記を実行した場合、次のようなエラーが表示されます。
RuntimeError: Invalid tag name or ifdId `Mytag', ifdId 1
予め定められたタグ以外を登録できないということです。
標準タグであれば、追加も可能になります。
その標準タグ一覧は、情報が整理されて公開はされていないようです。
あったとしても、Googleで検索が難しい状態と言えます。
Exif 2.3 タグ
https://www.vieas.com/exif23.html
上記ページが、情報としては最も充実して整理されているように感じます。
実際、そんなに需要がないのでしょうかね・・・
以上、pyexiv2の動作確認を説明しました。