vzの尺なblog

〜まだ 1 epoch 目〜

jpegのexifを編集(コマンドライン編)


 ネットでjpegファイルを公開するときに気になるのがjpegファイルに付与されているexif情報です。GPS位置情報や時刻情報などは個人の特定に繋がりかねません・・・ 。 exifを編集するGUIの便利なソフトはありますが、大量のjpegファイルを一枚ずつGUIベースのソフトで編集すのは面倒です。そこでコマンドライン一発で不要なexifを削除できないかと試行錯誤したので覚書です。

使用したソフト

jhead

コマンドラインベースのexifエディッタです。主にexif情報の表示や削除をする場合に使い勝手がよいです。

$ sudo apt install jhead

※公式サイトで大抵のOS(Win/Mac/Linux)のビルド済み実行ファイルが配布されてます。

exiftool

こちらもコマンドラインexifエディッタです。jheadと同様にexifの表示や削除ができますが、特にexifの一部の情報を上書きするのに重宝しました。

$ 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度回転しない画像が表示される。

sample.jpgの元画像
「jhead -purejpg」後の画像
元ファイル purejpgのみ


③ 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タグが消えています。表示も以下のように正常です。(縦横があってる)

sample.jpgの元画像
「jhead -autorot」後の画像
元ファイル autorotのみ


④ 上記②③を組み合わせて

$ 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で位置情報を地図上にマッピングすると意図した結果が得られます。

変更前(羽田空港
変更後(新千歳空港
GPS変更前 GPS変更後



環境

試した環境は以下の通りです。
- Ubuntu 18.04 LTS
- jhead v3.00
- exiftool Version 11.10
- GpsPrune バージョン:18.6