オープンソースの画像生成AIをセットアップから使い方まで解説する『Stable Diffusion AI画像生成ガイドブック』(ソシム刊)発売中(→本のサポートページ

iPhoneで撮った写真のEXIFを操作する2つのスクリプト

おもにMacでの話ですがWindowsでの使い方も後半に。

制作動機

こんなことを考えて作りました。

  1. iPhoneの「カメラ」で撮影した写真には、撮影情報(EXIF)として位置情報を記録できる([設定]−「位置情報サービス」で変更可能)。位置情報がついたままの写真をネットに公開すると、場合によっては自宅の場所を公開してしまうなどになりかねない。はてなフォトライフでは位置情報を非表示にできるが、写真データ内の位置情報は削除されない(idea:25625参照)。
    • 一度撮影した写真からGPSの情報だけを削除して、アップロードし直したい
    • →そこで「noGPS4iPhone」スクリプト
  2. iPhoneの「カメラ」以外のアプリで撮影した写真には、撮影日時や機種情報、シャッター速度などの撮影情報(EXIF)が入っていないことがある。これは場合によっては取り回しに不便がある。たとえばはてなフォトライフにアップロードすると、写真ページのURLは撮影日時ではなくアップした日時をもとにして作られてしまいスマートでない。
    • 写真ファイルのタイムスタンプをもとに、撮影日時のEXIF情報を付加したい(ついでに機種情報も付加しよう)
    • →そこで「addEXIF4iPhone」スクリプト

利用に必要なもの

ExifTool by Phil Harvey
http://www.sno.phy.queensu.ca/%7Ephil/exiftool/コマンドラインから使うEXIF編集ツール(WindowsではこれだけあればOK)
Automator
Mac OS Xに添付の自動処理ツール。「アプリケーション」フォルダにある
f:id:Imamura:20111125171749p:plain

「noGPS4iPhone」のソースリスト

bashシェルスクリプトなので、Automator以外で使うときは1行目に「#!/bin/bash」をつけるとたぶんよい。

export PATH=/opt/local/bin:/opt/local/sbin:$PATH
TODAY=`date "+%Y%m%d"`

for f in "$@"
do
	DATE_YYYYMMDDHHMI_SS=`stat -f "%m%t%Sm" -t "%Y%m%d%H%M.%S" "$f" |cut -f2-` #元ファイルのタイムスタンプを取得しておく

	NEWFILENAME=${f%/*}/noGPS_${f##*/} #新しいファイルのファイル名は「ファイルのパス + "noGPS_" + 元のファイル名」

	cp "$f" ${NEWFILENAME} #元のファイルをコピーしておく
	exiftool -overwrite_original -geotag= ${NEWFILENAME} #位置情報を削除する
	touch -t ${DATE_YYYYMMDDHHMI_SS} ${NEWFILENAME} #位置情報が削除された新しいファイルのタイムスタンプを元ファイルのタイムスタンプと同じにする
done

このスクリプトでは、元ファイルをコピーしておいてわざわざ「-overwrite_original」オプションをつけています。このオプションをつけないとExifToolは元ファイルを別名でバックアップしてくれるのだけど、これが「元ファイル名.元拡張子_original」という形式になってしまいます。

拡張子が「jpg」から「jpg_original」に変わってしまうのがいやなので、上のような処理にしているのでした。

ソースリスト内の「exiftool(…)-geotag=」を「exiftool(…)-gps:all=」にすると、カメラの向きの情報も削除します(カメラの向きが記録されるのは電子コンパスが内蔵されているiPhone 3GS以降)。

「addEXIF4iPhone」のソースリスト

これもAutomator以外で使うときは1行目に「#!/bin/bash」をつけるとたぶんよい。

export PATH=/opt/local/bin:/opt/local/sbin:$PATH
TODAY=`date "+%Y%m%d"`

for f in "$@"
do
	DATE_YYYYMMDDHHMISS=`stat -f "%m%t%Sm" -t "%Y/%m/%d %H:%M:%S" "$f" |cut -f2-` #元ファイルのタイムスタンプを取得しておく(1)
	DATE_YYYYMMDDHHMI_SS=`stat -f "%m%t%Sm" -t "%Y%m%d%H%M.%S" "$f" |cut -f2-` #元ファイルのタイムスタンプを取得しておく(2)

	NEWFILENAME=${f%/*}/exif_${f##*/} #新しいファイルのファイル名は「ファイルのパス + "exif_" + 元のファイル名」
	MODEL="iPhone 4S" #ここは自分の機種に合わせて

	cp "$f" ${NEWFILENAME} #元のファイルをコピーしておく
	exiftool -overwrite_original -Make=Apple -Model="$MODEL" -ALLDates="${DATE_YYYYMMDDHHMISS}" ${NEWFILENAME} #メーカー名「Apple」、機種名「iPhone 4S」、撮影日時(元ファイルのタイムスタンプ1)を書き込む
	touch -t ${DATE_YYYYMMDDHHMI_SS} ${NEWFILENAME} #EXIF情報が書き込まれた新しいファイルのタイムスタンプを元ファイルのタイムスタンプ(2)と同じにする
done

スクリプトをどうやってアプリケーションにするの

MacではAutomatorを使って、シェルスクリプトをアプリケーションにします。

  1. Automatorを起動
  2. 「書類の種類を選択してください:」で「アプリケーション」を選んで[選択]ボタンをクリック
  3. 「名称未設定(アプリケーション)」が開く
  4. 左端のペイン内「ライブラリ」−「ユーティリティ」を選択
  5. 左から2番目のペイン内「シェルスクリプトを実行」を、右の「ワークフローを作成するには、ここにアクションまたはファイルをドラッグしてください」へドラッグ&ドロップ
  6. 右ペインに「シェルスクリプトを実行」アクションが配置される
  7. 「シェル」が「/bin/bash」になっていることを確認
  8. 「入力の引き渡し方法」は「引数として」を選択
  9. 「for f in "$@"」…と表示されたスクリプト記入欄をいったんすべて消去し、上のスクリプトのどちらかを入力
  10. 「ファイル」メニューから「別名で保存」を選択、「noGPS4iPhone.app」や「addEXIF4iPhone.app」といったファイル名で保存(ファイル名は自由)

アプリケーションの使い方

保存したアプリケーションをダブルクリックしてもなにも起きません。これはファイルをドラッグ&ドロップして使うアプリです。

アプリケーションに画像ファイルをドラッグ&ドロップすると、EXIFの一部が削除または付加された画像ファイルが作られます。元のファイルはそのままです。複数の画像ファイルをまとめて処理することもできます。

before
f:id:Imamura:20111125171750p:plain
after
f:id:Imamura:20111125171751p:plain
「noGPS4iPhone」の処理
元ファイルと同じフォルダに、画像ファイル内の位置情報が削除されたファイルが作られます。新しいファイルのファイル名は「noGPS_元のファイル名」です。
「addEXIF4iPhone」
元ファイルと同じフォルダに、画像ファイルのタイムスタンプが撮影日時として書き込まれたファイルが作られます。新しいファイルのファイル名は「EXIF_元のファイル名」です。また新しいファイルには同時に撮影機種の情報として、メーカー名「Apple」、機種名「iPhone 4S」も書き込まれます。たとえばiPhone 3GSをお使いの方はスクリプト内の「MODEL="iPhone 4S"」の部分を「MODEL="iPhone 3GS"」に書き換えてください。iPhone 3Gの方は「iPhone」または「iPhone 3G」です(iOSのバージョンによるようです)。またiPod touchだと「iPod touch」です。これでわかるようにメーカー名や機種名は自己申告なので、好きなメーカー名やカメラの名前を入れることもできます。メーカー名「Anaheim Electronics」、機種名「RX-78-2」でもOKです。

なお「addEXIF4iPhone」を使っても、シャッター速度や絞り、ISOなどの情報は(元の画像に入っておらず知る方法もないため)書き込まれません。

また新しく作られるファイルのファイル名を変更したいときは、「NEWFILENAME=${f%/*}/noGPS_${f##*/}」や「NEWFILENAME=${f%/*}/exif_${f##*/}」といったところを変更します。ここで元のファイル名の後ろに文字列を追加した場合、拡張子が変化します。

下の画像は、位置情報つきの写真を「noGPS4iPhone」に通したときのEXIFの変化を「Reveal」で見たものです。

before
f:id:Imamura:20111126170902p:plain
after
f:id:Imamura:20111125174447p:plain

Windowsではどうするの(1)noGPS4iPhoneをWindows

Windows版のExifToolsをダウンロードしてファイルを解凍すると「exiftool(-k).exe」というファイルだけが出てきます。「(-k)」のところに好きなオプションを入れてリネームすればその処理をするプログラムになり、そこへ写真をドラッグ&ドロップすればオプションの通りに処理されるというしくみです。

「exiftool(-k).exe」というもとのファイル名を「exiftool(-geotag=).exe」にして、そこに写真をドラッグ&ドロップすれば、位置情報が削除された画像ファイルが作られます。

なおファイル名を「exiftool(-gps:all=).exe」にはできません。Windowsではファイル名に「:」を使えないからです。「exiftool(-k).exe」を「exiftool.exe」にリネームして、同じフォルダに「exiftool.exe -gps:all= %1」というバッチファイルを作ればいいのかも。

exiftool.exeを通すとファイルのタイムスタンプが処理した時刻に変わってしまうので、EXIF内の撮影時刻に戻したいときは別のソフトを使います。「F6 Exif」や「Flexible Renamer」は、ファイルのタイムスタンプを撮影時刻に合わせることができます。

Windowsではどうするの(2)addEXIF4iPhoneをWindows

ExifToolsにファイルのタイムスタンプを渡す方法を調べていないので、「F6 Tools」をとりあえず勧めておきます。

WindowsのExifToolsで複数ファイルにまとめてEXIFを埋め込みたい、という人は「google:バッチファイル タイムスタンプ 取得」などで検索してみてください。

ExifToolsでの書式は「exiftools.exe -Make="メーカー名" -Model="機種名" -ALLDates="YYYY:MM:DD HH:MM:SS"」です。

画像のEXIF情報を閲覧/編集できるソフトで結果を確認

スクリプトで作られた新しいファイルのEXIFを確認するには、「Reveal」を使うのが便利です。

起動すると表示されるウィンドウに画像ファイルをドラッグ&ドロップすると、撮影機種名や撮影日時、シャッター速度や位置情報などを見ることができます。このとき「Edit」ボタンをクリックするとEXIF情報を編集できます。

「あれ? じゃあスクリプトを用意しなくてもこれを使えばいいのでは?」

はい、EXIFを編集したいファイルが1つ2つなら「Reveal」で間に合うでしょうが、たくさんの写真を一度に処理したいときはスクリプトが便利です。

Windowsでは「F6 Exif」のほか、「XnView」でも画像のEXIF情報を確認できます。

iPhone用のEXIF確認アプリとしては「Exifレンズ」があります。iPhone内のこの写真をスクリプトにかけずにアップしてよいものかどうかわからなくなったという時などに。

Exifレンズ

Exifレンズ

参考にしたページ

このページで紹介されていたスクリプトを大いに参考にさせていただきました。ありがとうございます。

(こちらのスクリプトではファイル名がタイムスタンプに合わせて変更されたりします)

以下はExifToolの一般的な説明。

シェルスクリプトの処理については以下が「まさにこれだ」でした。

シェルスクリプトをアプリケーションにする方法

上で作ったAutomatorアプリケーションをもうちょっとちゃんと作りたいときにいいのかも。参考として。

このほかのMacEXIF編集ソフト

検索していて見つけたもの。メモとして。

ExifDateChange - CWS Download Page
http://homepage.mac.com/howdyedo/cws/software/index.html…デジカメの時計が合っていないまま撮影した写真の撮影時刻情報を訂正するのに便利。もともとEXIFが入っていない画像ファイルへの情報付加、GPS情報の削除にはともに非対応。複数ファイルの一括処理は可能。
ExifWriter
http://homepage2.nifty.com/ryuhei/Japanese/ExifWriter.htmlSnow Leopardでは起動せず。
AddDateExif
http://mortimer.hp.infoseek.co.jp/iweb/index.html…サイト消滅。infoseekめー。

Macで「サービス」に組み込む話

追記

そもそもiPhoneでの撮影時にEXIFをつけるかどうかを選べるとよい、という話を書きました。