2015 02 26

iPhoneで縦位置で撮った写真

ここ数年、撮った写真の整理は定型処理で、およそ以下の通り。

  1. とりあえず一時置きのディレクトリに置く。
  2. 写真のExif情報から撮影日時を取り出す。
  3. 保存先ディレクトリの下に撮影年月 yyyy/MM のディレクトリが無ければ作る。
  4. 撮影年月のディレクトリに、撮影日時 yyyyMMdd_hhmmss をファイル名としてコピーする。

手順の2〜4をrubyスクリプトで一括実行しているのだが、このrubyスクリプトが最近たまに 「Exif形式ではない」 と言ってくるようになった。 昨日撮った写真でも、いくつかそうだった。

Exifではないと判断した場合は、エラーメッセージを出力してそのファイルはスキップするようにしているので、最終的にスキップされたファイルだけが残るのだが、それらを眺めていて気がついた。 こいつら全部iPhoneで縦位置で撮ったものだ。 同じiPhoneで撮影したものでも、横位置で撮っている場合は問題無い。 写真専用機、つまりはただのカメラなのだが Panasonic DMC-TZ60 や RICHO CX3 で撮った写真は縦も横も問題無い。

なぜiPhoneの縦だけ?

と、当然の疑問に写真のファイルを調べてみたら、確かにデータの形式が違っていた。

俺の作ったrubyスクリプトでは、内部の情報抽出をだいたい以下の手順でやっている。

  1. JFIF形式としてファイルを解析

    • ファイルが ffd8 から始まること。
    • マーカーとそのデータを先頭から ffda が出現するまで取得できること。
    • マーカー ffe0 が存在すること。
    • マーカー ffe0 のデータの先頭が "JFIF" であること。

    これらを満たさない場合は、JFIF形式ではないとして終了。

  2. Exif形式としてファイルを解析

    • マーカー ffe1 が存在すること。
    • マーカー ffe1 のデータの先頭が "Exif" であること。

    これらを満たさない場合は、Exif形式ではないとして終了。

  3. マーカーffe1のデータをTIFF形式として解析

    撮影日時などの情報を取得。

で、iPhoneで縦位置で撮った写真で問題になるのは、マーカー ffe1 の内容。 これが "Exif" という文字で始まることを期待しているのだが、実際に入っているのはXML形式の何か。 昨日撮った写真だと以下の通り。

http://ns.adobe.com/xap/1.0/\x00 <?xpacket begin="\xEF\xBB\xBF" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 5.4.0"> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/" xmp:CreateDate="2015-02-25T12:07:30" xmp:ModifyDate="2015-02-25T12:07:30" xmp:CreatorTool="8.1.3" photoshop:DateCreated="2015-02-25T12:07:30"/> </rdf:RDF> </x:xmpmeta>

見やすいように改行と空白を入れているが、実際はぎゅっと詰まった1行。

先頭は "Exif" ではなくてadobeのURLになっていて、そのあとにXML形式のデータが続く。 撮影日は、同じ日付の値を持つ属性がいくつかあるが、名前から察するに CreateDate だろう。

データの何が問題かは解ったので、今度はなぜこうなるのかを調べてみた。 と言っても、こっちはいろいろググってみただけなのだが。 その結果、判ったのは、 iPhoneの写真は横が基本 ということ。 そして、 縦の場合はPhotoshopで加工して情報を追加している らしいこと。 この情報追加の結果が上記XMLで、これはRDFのXML表現なのだな。 Photoshopは組み込み版があるんだろうか。

加工するのは別に構わないが、その結果をなぜ横とは違う形式にしてしまうのか。 まさか、違う形式になっていることに気づいてないってことはないよな。

と、一瞬思ったのだが、自分らの仕事を振り返って、無いとは言い切れない気がしてきた。 「画像編集ツールが用意されているのだから、それを使えばいいじゃないか。 その分開発工数も減らせるし、信頼性は高まるし。 保存形式? ツールの標準なんだし、同じじゃないの? jpegでしょ?」 なんて言ってそう。 まあ、adobeが吐き出すものなんだから大丈夫だと言われたら、俺もちょっと納得しちゃいそうだけどさ。

と言うか、俺のツールのExif判定が足りないだけなのか。 でも、前に調べた時はこんなのは無かった気がするし、割と新しいのかもしれないな。 何であれ、現に存在しているのだし、これを機会にこっちの形式からも撮影日時が取れるように修正するか。