AWS S3のJPEG画像のExif情報を一括で削除して更新する

Google PageSpeed Insights*1で、自作のRailsWebサービスの短歌投稿サイトUtakataを調べていたら、「適切なサイズの画像」という項目に引っかかった。詳細を見てみると、アイコンに使われているJPEG画像のサイズが、数KB〜数100KBまで妙に差があることが原因のようだ。

Exifとは、デジタルカメラで撮影した画像データに、撮影条件に関する情報(メタデータ)を追加して保存できる、画像ファイル形式の規格のことである。

同じ大きさの画像なのにファイルサイズが大きく異なるのは、Exifというメタ情報がJPEG画像に保存されていることによるらしい。

試しに上のWebツールでExif情報を除去してみたら、確かにファイルサイズが減った。

Rails + PaperclipでアップされるJPEG画像のExif情報を除去する

UtakataはRails向け画像アップロードライブラリのPaperclipを利用しているので、まずは今後アップされる画像についてはExif情報を除去して保存されるように設定する。

これは上のように、convert_options: { all: '-strip' }を追加するだけでOKだった。

S3のJPEG画像のExif情報を削除して更新する

これで新規にアップされる画像についてはExif情報が除去されるけれど、既にS3にアップされているJPEG画像のExif情報を除去する必要がある。

S3の画像を一括でダウンロードする

S3はWebの画面上の操作で画像を一括でダウンロードできないけれど、AWS CLIコマンドラインインターフェース)を使えば一括でダウンロード/アップロードできることが分かった。

$ brew install awscli

AWS CLIを使うのは初めてだったので、まずはインストールする。

$ aws configure

を実行すると、AWSアクセスキー、シークレットアクセスキー、リージョン情報、Default output format*2の4項目が聞かれるで、それぞれ入力する。

そこまで出来たら、

$ aws s3 cp s3://utakata/ ./utakata --recursive

このコマンドでS3にアップされている内容をそのまま全部ダウンロードする。

Exif情報を一括で除去する

$ find ./utakata/ | grep ".jpe\?g$" | xargs -t -n 10 -P 4 mogrify -strip

その後、上の参考サイトにあるこのコマンドを実行したら、ガガっと一瞬でExif情報が一括で除去された*3

S3に画像を一括でアップロードする

最後に、

$ aws s3 cp ./utakata s3://utakata/  --recursive

このコマンドで一括アップロードしたら、Exif情報が除去された状態ですべての画像が更新されて目的を達成することができた。

f:id:fuyu77:20190316194728p:plain

PageSpeed Insightsのスコアも94点まで出るようになって良い感じだ。

*1:任意のWebページの表示速度をチェックして改善のアドバイスを貰えるWebサービス

*2:デフォルトのjsonの他にtextとtableがあるらしい。取り敢えず何も打たずにエンターで良さそう。

*3:このコマンドを実行するにはImageMagickがインストールされている必要がある。