iOSを10にしたら、iPhoneをMacにつないでもDropboxの「カメラアップロード」で「新しい写真/動画を見つけることができませんでした」しか言わなくなった。なぜ?
理由はわからないがそういうことなら、別の方法で写真や画像を取り出すようにしよう。IFTTTを使うことにした。iPhoneにIFTTTを入れて(→[App Store])下のアプレットを検索し「Turn On」にする。
- Back up new iOS photos you take to Dropbox - IFTTT(https://ifttt.com/applets/103376p-back-up-new-ios-photos-you-take-to-dropbox)
右上の歯車アイコンをタップして保存先のフォルダを選択。
写真を撮ったりスクリーンショットを取ったりしてしばらくたつと画像がDropboxへ転送され通知が出る。
- おまけ情報
- iPhoneのIFTTTではこのほか、「instagramへの投稿を写真つきでツイートする」というのを使っている。instagramへの投稿をTwitterに流してもタイムラインに写真が表示されないのはこれで解消できる→Tweet your Instagrams as native photos on Twitter - IFTTT https://ifttt.com/applets/103249p-tweet-your-instagrams-as-native-photos-on-twitter
さて、IFTTTを通して取得された画像のファイル名は「July_31__2017_at_0337PM.png」のような書式になる。ファイル名を日時にするとこの書式しか選べないようだ。Dropboxの「カメラアップロード」では「2017-07-31 15.37.48.png」という書式で保存されていた。iPhoneの写真や画像はこれの先頭に「iPhone_」をつけて「iPhone_2017-07-31 15.37.48.png」のようにしている。引き続きこういうファイル名を使っていきたい。
またDropboxへ転送されたファイルのタイムスタンプは撮影した日時ではなく転送された日時になってしまう。これもなんとかしたい。
Shupapanなどのリネームソフトを使うと、ファイル内の撮影情報をファイル名にしたり、ファイルのタイムスタンプを変えたりできる。
- Sunskysoft - Shupapan|Shupapan(http://sunsky3s.s41.xrea.com/shupapan/)
でもiPhoneから画像を転送するたびにこれを起動して操作するのは面倒だ。ドラッグ&ドロップすればファイル名やタイムスタンプが変更されるようなしくみにしたい。
そこでAutomatorを使うことにした。Automatorで「アプリケーション」を作ってそこへファイルをドラッグ&ドロップすればいろいろ処理される。
ファイル内の撮影情報を取得するには「ExifTool」や「Exiv2」を使う。
- ExifTool by Phil Harvey(http://owl.phy.queensu.ca/~phil/exiftool/)
- Exiv2 - Image metadata library and tools(http://www.exiv2.org/index.html)
どちらも開発は活発で頼もしい。インストールはHomebrewが入っていればどちらも「install」一発で。
- Homebrew ― macOS 用パッケージマネージャー(https://brew.sh/index_ja.html)
brew install exiftool
brew install exiv2
さて、ExifToolもExiv2も画像に埋め込まれた情報を取り出したり、それをもとにファイル名を変更したりできる。タイムスタンプの変更も可能だ。
ExifToolはリネーム時に重複するファイルがあると、ファイル名の末尾(拡張子の手前)に「-1」「-2」…と数字をつけてくれるオプションがある。HDR撮影(のオリジナルを残す設定)やバーストモードで撮影した写真は、撮影日時が秒まで同じになることがある。その対処もしてくれるなら今回はExifToolを使うことにしよう。
(Exiv2はExifToolより高速だそうなので、まったく同じ処理ならExiv2のほうがよいかも)
iPhoneのスクリーンショットはPNG形式で、これにも画像情報が含まれている。「DateCreated」というタグに画像の作成日時が入っているので、それをもとにファイル名やタイムスタンプを変更する。
写真の撮影日時を含むタグは「CreateDate」で、スクリーンショットとは異なる。画像にどちらのタグが含まれているかをチェックして処理を振り分けた。
以下のシェルスクリプトを使う。
#!/bin/bash export PATH=${PATH}:/usr/local/bin/ for f in "$@" do #撮影日時を含む写真にファイル名をつける if exiftool -s "${f}" | grep -q CreateDate ; then exiftool '-CreateDate>FileModifyDate' "${f}" exiftool '-FileName < CreateDate' -d iPhone_%Y-%m-%d\ %H.%M.%S%%-c.%%e "${f}" #撮影日時を含まずDateCreatedを含む画像にファイル名をつける elif exiftool -s "${f}" | grep -q DateCreated ; then XMP_CREATEDDATE=`exiftool -s "${f}" | grep -q DateCreated` YY=${XMP_CREATEDDATE:34:4} mm=${XMP_CREATEDDATE:39:2} DD=${XMP_CREATEDDATE:42:2} HH=${XMP_CREATEDDATE:45:2} MM=${XMP_CREATEDDATE:48:2} SS=${XMP_CREATEDDATE:51:2} EXT=${f##*.} NEWFILENAME="iPhone_$YY-$mm-$DD $HH.$MM.$SS.$EXT" TIMESTAMP="$YY$mm$DD$HH$MM.$SS" mv -f "${f}" "${f%/*}/$NEWFILENAME" touch -t $TIMESTAMP "${f%/*}/$NEWFILENAME" fi done
上のシェルスクリプトの終わり近くにある「touch -t $TIMESTAMP "${f%/*}/$NEWFILENAME"」はシェルスクリプトのtouchコマンドでファイルのタイムスタンプを変更している。「touch -t 201708031234.56 ファイル名」でファイルのタイムスタンプが2017年8月3日12時34分56秒になる。
あとMacの「ターミナル」でファイルのタイムスタンプを秒まで見たいとき、lsコマンドの「--full-time」オプションは使えず、代わりに「-lT」(小文字のL+大文字のT)オプションを指定する。
Automatorとしてはこんな感じ。
- エラーが出る場合は改行を入れ直すといいかも
- 上のスクリプトをコピーしてもエラーが出て動かない場合、改行コードが原因かもしれない。Automatorのエディタ上ですべての改行を手で入れ直すと動くことがある。行頭にカーソルを持っていき[delete](backspace)を押してから[return]キーを押す。これをすべての行で行う。
「Finder項目をコピー」はスクリプトの信頼性が上がったら「Finder項目を移動」にしちゃってもいいし、そもそもIFTTTでコピー先のフォルダに直接転送してしまえば「Finder項目をコピー」のアクションは不要になる。
PNGやjpgの画像で、DateCreatedやCreateDateを含まなかった場合はリネームされない。Dropboxの画像転送で1枚だけ選択し、「次へ」をタップすると転送時のファイル名がわかる。これは「画像 2017-08-03 00.00.00.png」のような書式で、取得時(撮影時)のタイムスタンプになっている。これをもとに手動で「touch -t」コマンドを使っている。面倒だがやむをえない。
iPhoneで撮影した動画はどうしよう。動画はIFTTTでの自動転送はできないようなので、面倒だけれどiPhoneのDropboxアプリで手動で転送しよう。
転送された動画のファイル名は「動画 2017-08-03 00.00.00.mov」という書式である。これをもとにファイル名とタイムスタンプを調整する。
作ったシェルスクリプトは以下。上と同様、Automatorで「アプリケーション」を作って「シェルスクリプトを実行」だけを使う。
for f in "$@" do FILENAME=${f##*/} YY=${FILENAME:7:4} mm=${FILENAME:12:2} DD=${FILENAME:15:2} HH=${FILENAME:18:2} MM=${FILENAME:21:2} SS=${FILENAME:24:2} EXT=${f##*.} NEWFILENAME="iPhone_$YY-$mm-$DD $HH.$MM.$SS.$EXT" TIMESTAMP="$YY$mm$DD$HH$MM.$SS" cp "${f}" "${f%/*}/$NEWFILENAME" touch -t $TIMESTAMP "${f%/*}/$NEWFILENAME" done
これでよし。Dropboxで転送した画像は前述の通り「画像 2017-08-03 00.00.00.png」のようなファイル名になるので、これも上のシェルスクリプトを通していい感じにできる。
ExifToolで参考にしたページ
- 【基本的な使い方】Mac で Exif を編集したり削除したりできる「ExifTool」 | 使える機材 Blog!(http://panproduct.com/blog/?p=23709)
- exiftool.exeの利用方法:自分用まとめ Jin/Gy-Oのブログ/ウェブリブログ(http://jinblog.at.webry.info/201105/article_10.html)
- exiftoolでファイル名変更とディレクトリ作成&移動 - yuyunko's blog(http://yuyunko.hatenablog.com/entry/20110621/1308659211)
- 【Perl】写真の撮影時間をファイルのタイムスタンプに反映 - Resilient Mind(http://www.markn.org/blog/2016/07/exif-timestamp.html)
- 【Python】写真のexif撮影時刻とファイルタイムスタンプを一括置換 - いーぐる02's Blog(http://eagle02b.blog55.fc2.com/blog-entry-104.html)
Exiv2で参考にしたページ
- デジカメ写真の整理手法とexiv2コマンドの使い方 | トリブロ(http://serial-experiments.jp/blog/?p=512)
- 写真のファイル名を撮影した日時にする方法【Mac】 - うむらうす(http://www.umurausu.info/blog/archives/add_date_time_to_photo_filename.html)
Exiv2で作ったシェルスクリプトは以下。JPGのリネームとタイムスタンプ変更が1行でできるのがExiftoolと違うところ。ただし重複チェックはできないようだ。
(スクリプトが動かない理由が上記の改行コードの問題とわかるまでExifToolとExiv2を行ったり来たりしているうちExiv2でも動くコードができた)
#!/bin/bash export PATH=${PATH}:/usr/local/bin #必要だった for f in "$@" do if exiv2 -Pk "${f}" | grep -q Exif.Photo.DateTimeOriginal ; then exiv2 -v -t -r "iPhone_%Y-%m-%d %H.%M.%S" "${f}" elif exiv2 -Pk "${f}" | grep -q Xmp.photoshop.DateCreated ; then XMP_CREATEDDATE=`exiv2 -PXt "${f}"` YY=${XMP_CREATEDDATE:0:4} mm=${XMP_CREATEDDATE:5:2} DD=${XMP_CREATEDDATE:8:2} HH=${XMP_CREATEDDATE:11:2} MM=${XMP_CREATEDDATE:14:2} SS=${XMP_CREATEDDATE:17:2} EXT=${f##*.} NEWFILENAME="iPhone_$YY-$mm-$DD $HH.$MM.$SS.$EXT" TIMESTAMP="$YY$mm$DD$HH$MM.$SS" mv -f "${f}" "${f%/*}/$NEWFILENAME" touch -t $TIMESTAMP "${f%/*}/$NEWFILENAME" fi done
シェルスクリプトで参考にしたページ
- bashでパラメータ展開を用いて変数を利用する | 俺的備忘録 〜なんかいろいろ〜(https://orebibou.com/2017/01/bashでパラメータ展開を用いて変数を利用する/)
※「${hoge/a/b}」は「最初のaのみbに置換」。すべてのaをbに置換したいときは「${hoge//a/b}」と書く。
- dirname、basenameは「%/*」と「##*/」で書くと処理速度が早くなる - Qiita(http://qiita.com/rita_cano_bika/items/712807a5f79065aab7d2)
pngファイルの重複チェック実装に参考になるかもしれないページ
- ファイル名変更 | 公式 Apple サポートコミュニティ(https://discussionsjapan.apple.com/thread/10051203?start=0&tstart=0)
参考
ファイルのタイムスタンプを撮影情報に合わせるアプリがあったが、自分のEl Capitanではうまく動作しなかった。
- 【自作Macアプリの紹介】デジカメ変更日を撮影日に一括変更 for Mac - creativi.tea(http://teapipin.blog10.fc2.com/blog-entry-271.html)