Python で JPG ファイルから Exif 情報を削除する
Python を使って JPG ファイルから Exif 情報を取り除く方法について、piexif を使った方法と Pillow を使った方法を紹介します。
[はじめに]
デジカメで撮影したデータには、 Exif 情報が含まれていて画像の管理にはとても便利です。ただし、位置情報等の個人情報につながる情報も含まれていますので、ネット上にアップロードする際には削除したいものです。(位置情報をあえて公開したい方もいるかと思いますが・・・)
[Piexifを使った場合]
Piexif は、Exif を簡単に扱うための Python ライブラリです。
pip でインストールできます。
$ pip install piexif
Exif 情報の削除は、1行で済みます。(import 含めても 2行)
import piexif
piexif.remove('imagefile.jpg')
このように、Piexif はとても便利なライブラリなのですが、Photoshop Exements で加工したファイルの場合に Exif 情報を消しきれない、Exif 情報の項目と内容がずれる等の事態が発生したので別の方法を探りました。(検証したファイルを紛失してしまったので例示できません。あしからず。)
[Pillow を使った場合]
Pillow を使って Exif 情報を削除する事ができましたので、こちらも紹介します。
Pillow も pip でインストールできます。
$ pip install pillow
Pillow では、Exif 情報をを削除するというより、画像データのみを抜き出すというイメージになりますので、かなりファイルをスリム化できます。
まず、ファイルを開いて (open) 、データを読み込み (getdata) 、モード、サイズを取得しておきます。
from PIL import Image
with Image.open('src.jpg') as src:
data = src.getdata()
mode = src.mode
size = src.size
次に、取得したモードとサイズで新規にファイルを作成 (new) し、データを書き出して (putdata) 保存 (save) すれば OK です。
with Image.new(mode, size) as dst:
dst.putdata(data)
dst.save('dst.jpg')
以上で、'src.jpg' から画像データだけを抽出して 'dst.jpg' に書き出す事ができました。ファイルサイズがかなり小さくなっているのが確認できると思います。
Windows のエクスプローラでプロパティ > 詳細を確認する等して、Exif 情報が消えているのを確認できると思います。
解像度の表示も変わっている場合があるのですが、ピクセル数に変化は無いので、画質に変化はなく、Exif 情報に入っていた「解像度」情報が無くなったために Windwos の標準解像度である 96dpi が表示されるようになっただけだと思われます。
[最後に]
Exif 情報の領域は 0x00 でパディングされている領域が多くて、これらがなくなると相当にファイルサイズを小さくできる事がわかりました。
アップロードする際には、下手に画質を調整してサイズを削るよりまず Exif 情報を消した方が良さそうです。
[参考]
Stack Overflow: Python: Remove exif info from images
この記事は、下記にも記述しています。