7,801 views
この記事は最終更新から 1876日 が経過しています。
Macとは直接関係ないのだが、同じAppleということで備忘録。
問題発生
子供の写真アルバムをPHPで自作し、WEB上に設置した。
デジカメやスマホで撮影した画像をそこにアップロードして保存しているのだが、
そのときに画像ファイルの EXIF情報から撮影日時を取得し、
「撮影日時 : 〇月〇日 〇時〇分」
とアルバム内に表示させている。
ところが…
iPhone5から iPhone8 に変えたところ、撮影日時情報が取得できなくなった!
直接の原因は、Safariや Chromeなどの WEBブラウザから画像をアップロードする際に、EXIF情報が消された画像が送られてしまうこと。撮影日時は EXIF.DateTimeOriginal に格納されているはずなのだが、これが存在しない。
ちなみに妻の iPhone6では問題なく機能している…
対策
海外サイトをググってみたが、2017年11月8日時点で有効な対策が見つかっていない。
stackoverflowで同じことを書いている人がいるので、ここでの進展をチェックし続けよう。
とは言え子供の写真は日々蓄積されるわけで…
現在は苦肉の策として以下のような手順で問題を回避している。
1) 対象画像を自分(撮影したiPhone)にメールで送信する。
2) メールを受信し、添付画像を保存する。
3) 保存した画像を WEBブラウザでアップロードする。
なぜか、メールで受信した画像ファイルだと、WEBブラウザからのアップロード時に EXIF情報が消されない。
これはこれで結構な手間なので、引き続き根本的な対策を探してみよう。
【解決】2017.12.01追記
汎用的な画像投稿サービスを提供しているのであれば「無事解決」とは言えないが、自分の家族限定でサービスを提供している自分にとっては無事解決した。
ToDo: 写真撮影時の画像フォーマットを「互換性優先」に変更する。
1) 設定画面を開き「カメラ」を選択する。
2) 「フォーマット」を選択する。
3) 「互換性を優先」を選択する。
以上です。
この後は WEBブラウザからの画像アップロード時に EXIF.DateTimeOriginal が消えなくなりました。
おまけ: 「高効率」を選択するとHEIF形式で保存される。
iOS11ではフォーマットの初期値が「高効率」になっている。
画像ファイルサイズを小さく出来るので、パソコンのように大きなストレージを持てないスマホでは当然の選択と理解できる。
「ところで、高効率って何だろう?」
上記3)の設定画面に書かれているように、「高効率」を選択した場合は画像ファイルフォーマットとして HEIF(High Efficiency Image File Format)が選択される。JPEG, PNG, TIFF, GIFなどではなく HEIF形式で画像ファイル出力される。
HEIFの詳細は以下の wikiを参照のこと。
https://en.wikipedia.org/wiki/High_Efficiency_Image_File_Format
もし汎用的なサービスを提供するのであれば、このHEIFファイルフォーマットの仕様を調べ、アップロードされたサーバー側でこれを解析し、メタデータを取り出すコードを書く必要があるだろう。すでにHEIFを扱うライブラリが公開されていればそれを使うと楽に実装できるはず。
今回は自分の家族だけを対象としたサービスなので、利用者側(=私一人)の iPhoneの設定を変えて対応完了とする。
めでたしめでたし。