Googleのレンズぼかし機能のファイル構造

Google Cameraの目玉機能としてレンズぼかし機能があります。

スマフォのカメラで擬似的に高深度の写真を取る機能です。

例えば、次のような写真が撮れます。

レンズぼかしで撮影

この機能の方法はGoogleのブログで解説されていますが、後からフォーカスを設定できたりと面白いのでどのようなファイル構造になっているかを調べてみました。

Exiftoolからの出力はこんな感じ。

ExifTool Version Number : 9.46
File Name : IMG_20140416_181937.jpg
Directory : .
File Size : 909 kB
File Modification Date/Time : 2014:05:01 18:06:55-07:00
File Access Date/Time : 2014:05:01 18:06:57-07:00
File Inode Change Date/Time : 2014:05:01 18:06:55-07:00
File Permissions : rw-rw-r--
File Type : JPEG
MIME Type : image/jpeg
Exif Byte Order : Big-endian (Motorola, MM)
GPS Latitude Ref : North
GPS Latitude : 47 deg 36' 45.04"
GPS Longitude Ref : West
GPS Date Stamp : 2014:04:17
GPS Longitude : 122 deg 20' 0.10"
GPS Time Stamp : 01:19:28
Modify Date : 2014:04:16 18:20:08
XMP Toolkit : Adobe XMP Core 5.1.0-jc003
Blur At Infinity : 0.017260155
Focal Distance : 18.298956
Focal Point X : 0.5
Focal Point Y : 0.5
Mime : image/jpeg
Format : RangeInverse
Near : 11.670198440551758
Far : 53.99827575683594
Mime : image/png
Has Extended XMP : 16D07BD6549EF7884C2D15AB36A95F28
Data : (Binary data 369408 bytes, use -b option to extract)
Data : (Binary data 204032 bytes, use -b option to extract)
JFIF Version : 1.01
Resolution Unit : None
X Resolution : 1
Y Resolution : 1
Image Width : 1536
Image Height : 2048
Encoding Process : Baseline DCT, Huffman coding
Bits Per Sample : 8
Color Components : 3
Y Cb Cr Sub Sampling : YCbCr4:2:0 (2 2)
GPS Date/Time : 2014:04:17 01:19:28Z
GPS Latitude : 47 deg 36' 45.04" N
GPS Longitude : 122 deg 20' 0.10" W
GPS Position : 47 deg 36' 45.04" N, 122 deg 20' 0.10" W
Image Size : 1536x2048

メタデータ部分に二つのバイナリデータが存在するのが確認できます。これを出力してみるとこれらはXMPとして記録されているデータであることがわかりました。一つはPNGファイル、そしてもう一つがJPEGファイルです。

まずはJPEGファイルを出力してみました。

exiftool -X -b IMG_20140416_181937.jpg | sed -n '/XMP-GImage:Data/{s/.(.)<\/XMP-GImage:Data>.*/\1/;p}' | base64 -d > IMG_20140416_181937_xmp.jpg

GImage:Dataに含まれるのは以下の画像でした。つまり、これはカメラが見たそのものの画像となります。

GImage:Data

もう一つPNGとして記録されている画像は次のように出力しました。

exiftool -X -b IMG_20140416_181937.jpg | sed -n '/XMP-GDepth:Data/{s/.(.)<\/XMP-GDepth:Data>.*/\1/;p}' | base64 -d > IMG_20140416_181937.png

こちらの名称はGDepth:Dataで、被写体の距離が示されたもので、色が濃いほど近くのものとなります。

GDepth:Data

この機能を使用して撮られた写真は単体で深度情報を含んでいるため、例えば他の機種で撮った写真をGoogle Cameraがインストールされた機種にコピーなどをするとそのままフォーカスを再度変えたりすることができます。Google+なんかでブラウザ上でこれができたら面白いと思うのですが、必要な情報は全てファイルに内包しているということもあり、実現されるかもしれません。