jpegのexifを編集(コマンドライン編)
ネットでjpegファイルを公開するときに気になるのがjpegファイルに付与されているexif情報です。GPS位置情報や時刻情報などは個人の特定に繋がりかねません・・・ 。 exifを編集するGUIの便利なソフトはありますが、大量のjpegファイルを一枚ずつGUIベースのソフトで編集すのは面倒です。そこでコマンドライン一発で不要なexifを削除できないかと試行錯誤したので覚書です。
使用したソフト
jhead
コマンドラインベースのexifエディッタです。主にexif情報の表示や削除をする場合に使い勝手がよいです。
公式サイト
Exif Jpeg header manipulation tool
http://www.sentex.net/~mwandel/jhead/インストール
ubuntuならaptでインストール
$ sudo apt install jhead
※公式サイトで大抵のOS(Win/Mac/Linux)のビルド済み実行ファイルが配布されてます。
exiftool
こちらもコマンドラインのexifエディッタです。jheadと同様にexifの表示や削除ができますが、特にexifの一部の情報を上書きするのに重宝しました。
インストール
ubuntuならaptでインストール
$ sudo apt install exiftool
※公式サイトで大抵のOS(Win/Mac/Linux)のインストール方法が記載させてます。
不要なexifを削除する(サブフォルダも含めて全て)
結論から先に言うと以下に落ち着きました。
$ for filename in `find ./ -iname \*.jpg -or -iname \*.jpeg`; do jhead -purejpg -autorot $filename; done
それでは、以下順を追って・・・
① jheadでexif情報を表示する
まずはsample.jpgのexifを表示させてみます。
$ jhead sample.jpg File name : sample.jpg File size : 54821 bytes File date : 2018:09:20 19:45:15 Camera make : Apple Camera model : iPhone 6s Date/Time : 2018:09:18 10:07:17 Resolution : 403 x 302 Orientation : rotate 90 Flash used : No Focal length : 4.2mm (35mm equivalent: 29mm) Exposure time: 0.0029 s (1/349) Aperture : f/2.2 ISO equiv. : 25 Whitebalance : Auto Metering Mode: pattern Exposure : program (auto) GPS Latitude : N 35d 40m 16.5108s GPS Longitude: E 139d 45m 53.982s GPS Altitude : 2.29m JPEG Quality : 95
いろいろ付与されてます。GPS情報ものっています。ちなみに、-v オプションで更に詳細な情報が表示されます。
② jheadで不要なexifを削除する
$ jhead -purejpg sample.jpg Modified: sample.jpg $ jhead sample.jpg File name : sample.jpg File size : 43797 bytes File date : 2018:09:20 19:45:15 Resolution : 403 x 302 JPEG Quality : 95
大分スッキリしました。GPS情報も削除されています。しかし、これだけだと画像によっては縦横の表示が逆になってしまいます。これは、exifの Orientationタグ(画像の回転情報)が消されたためです。
※「 Orientation : rotate 90」が消されたので90度回転しない画像が表示される。
|
|
③ Orientationタグの回転情報を画像自体に反映させる
jheadにオプション -autorot を指定すると上記のOrientationタグを元に、画像自体に回転させて、なおかつタグを消してくれます。
$ jhead -autorot sample.jpg Modified: sample.jpg $ jhead sample.jpg File name : sample.jpg File size : 53362 bytes File date : 2018:09:20 19:45:15 Camera make : Apple Camera model : iPhone 6s Date/Time : 2018:09:18 10:07:17 Resolution : 288 x 403 Flash used : No Focal length : 4.2mm (35mm equivalent: 29mm) Exposure time: 0.0029 s (1/349) Aperture : f/2.2 ISO equiv. : 25 Whitebalance : Auto Metering Mode: pattern Exposure : program (auto) GPS Latitude : N 35d 40m 16.5108s GPS Longitude: E 139d 45m 53.982s GPS Altitude : 2.29m
Orientationタグが消えています。表示も以下のように正常です。(縦横があってる)
|
|
④ 上記②③を組み合わせて
$ jhead -purejpg -autorot sample.jpg Modified: sample.jpg $ jhead sample.jpg File name : sample.jpg File size : 42973 bytes File date : 2018:09:20 19:45:15 Resolution : 288 x 403 JPEG Quality : 95
これで意図した通りに不要なexifが削除できました。
⑤ サブフォルダすべてのjpegファイルに適用する
bashとfindを合わせて以下で目的達成です。なんかもっと簡単な方法があるような・・・
$ for filename in `find ./ -iname \*.jpg -or -iname \*.jpeg` > do > jhead -purejpg -autorot $filename > done
exif情報を元にファイル名を撮影日時に変える
jpegのファイル名をexif情報の撮影日時に変更する方法も便利そうなのでメモ。写真を整理したりするのに役に立ちそうなきがすので・・・
jheadの -nf オプションでファイル名を撮影日時にできます。フォーマット文字列は公式サイトに記載があります。
$ jhead -nf%Y%m%d-%H%M%S sample.jpg sample.jpg --> 20180918-100717.jpg
フォルダ以下すべて変えるにはbashとfindを組み合わせて上記と同様に実行。
変更前
$ tree . ├── IMG_3561.JPG ├── inu1 │ ├── IMG_2985.JPG │ ├── IMG_2988.jpeg │ └── IMG_3241.JPG ├── inu2 │ ├── IMG_3305.JPEG │ └── IMG_3502.JPG └── sample.jpg 2 directories, 7 files
ファイル名を変更
$ for filename in `find ./ -iname \*.jpg -or -iname \*.jpeg` > do > jhead -nf%Y%m%d-%H%M%S $filename > done
変更後
$ tree . ├── 20180918-100717.jpg ├── 20180918-100717a.jpg ├── inu1 │ ├── 20170101-093647.jpg │ ├── 20170101-095133.jpg │ └── 20180701-182534.jpg └── inu2 ├── 20180721-183656.jpg └── 20180908-172942.jpg 2 directories, 7 files
exif情報を書き換える
exif情報を書き換えるにはexiftoolが便利です。以下、例としてGPS位置情報を変更します。またGPS情報は「GpsPrune 」というGUIソフト(ubuntu package に登録されてる)を使い地図上にマッピングして確認しました。
① exiftoolで目的のexifタグの目星をつける
まずはsample.jpgのexifを表示させて目的のタグの目星をつけます。-vオプションでの階層構造も表示できます。
$ exiftool -v sample.jpg ExifToolVersion = 10.80 FileName = sample.jpg 〜中略〜 | 10) GPSInfo (SubDirectory) --> | + [GPS directory with 15 entries] | | 0) GPSLatitudeRef = N | | 1) GPSLatitude = 35 33 0.6 (35/1 33/1 3/5) | | 2) GPSLongitudeRef = E | | 3) GPSLongitude = 139 47 10.1 (139/1 47/1 101/10) 〜以下略〜
いっぱい表示されます。今回はGPSの緯度経度なので上記の抜粋部分が該当します。これで、北緯:35 33 0.6 / 東経:139 47 10.1(羽田空港)です。
② exiftoolでタグを変更する
羽田空港から新千歳空港(北緯:42 47 34. / 東経:141 40 10.3に変更します。
$ exiftool -GPSLatitudeRef=N -GPSLatitude="42 47 34.4" -GPSLongitudeRef=E -GPSLongitude="141 40 10.3" sample.jpg $ exiftool -v sample.jpg | grep GPS | 10) GPSInfo (SubDirectory) --> | + [GPS directory with 15 entries] | | 0) GPSLatitudeRef = N | | 1) GPSLatitude = 42 47 34.4 (42/1 47/1 172/5) | | 2) GPSLongitudeRef = E | | 3) GPSLongitude = 141 40 10.3 (141/1 40/1 103/10) 〜以下略〜
変わりました。GpsPruneで位置情報を地図上にマッピングすると意図した結果が得られます。
|
|
環境
試した環境は以下の通りです。
- Ubuntu 18.04 LTS
- jhead v3.00
- exiftool Version 11.10
- GpsPrune バージョン:18.6