PIB - 20180518: Office Lens と Google Photo で解像度がおかしい

状況

Google Photo 側の設定は「高画質」ではなく「元の画質」が選択されており、
しかも Android 側で 16MP に満たない (13.0MP 3120x4160 133kB の) 画像をアップロードしているにも関わらず、
Google Photo にアップロードされた画像を確認してみると 0.7MP 720x1000 133.5KB とか
地味にデグレードされたファイルに変換されてしまうという謎現象が発生。

全て Office Lens で撮影した jpg ファイルなんだけど、詳しく調べてみると以下のような状況だった。
Office Lens の解像度Google Photo (アプリ)の表示Google Photo (ブラウザ)の表示ImageMagick の表示
13.0M(4160x3120)13.0MP3120x4160133KB0.7MP720x1000133.5KB720x1000 133492B
8.3M(3840x2160)8.3MP2160x3840133KB0.7MP720x1006133.3KB720x1006 133301B
8.0M(3264x2448)8.0MP2448x3264122KB0.7MP720x1005122.2KB720x1005 122200B
7.7M(3200x2400)7.7MP3200x2400813KB7.7MP2343x3277813KB2343x3277 813145B
5.0M(2592x1944)5.0MP2592x1944544KB5MP1897x2655544.2KB1897x2655 544241B
4.1M(2688x1512)(規定)4.1MP1512x2688130KB0.7MP720x1010130.1KB720x1010 130108B
3.1M(2048x1536)3.1MP1536x2048130KB0.7MP720x1009130.2KB720x1009 130172B
2.1M(1920x1080)2.1MP1080x1920126KB0.7MP720x1006126KB720x1006 126041B

当初、Google Photo の不具合を疑い 507SH, Android One 上の Android アプリ版 Google Photo と
PC の ブラウザ版 Google Photo の information 表示を比べて眺めていた段階では、
傾向としてファイルサイズが一定のサイズ以下だと 0.7MP にデグレードされてるっぽい感じがしていた。

しかし、と言うか、そもそも、Office Lens での撮影結果を見た際、
7.7M (3200x2400) と 5.0M (2592x1944) 以外の解像度がすべて 130KB 前後のファイルサイズになっているのは、
かなりおかしい気がするというか、
道理で、規定の 4.1MP から最高画質であるはずの 13.0MP にしても、画質が改善されないわけだ。

更に、A4 サイズを撮影しているのに、
Office Lens における撮影時の解像度と撮影結果の解像度が一致しているというは、
仮に引き延ばされているのだとしても、
A4 のアスペクト比は 297x210mm で 99:70(1.414) なのだから、
撮影時のアスペクト比 4:3(1.333) または 16:9(1.778) になってしまっているのはどう考えてもおかしい。

あまりにもおかし過ぎるので、
USB ケーブルで MTP 接続して直接 PC に引っ張り出して来て、
ImageMagick の identify コマンドで調べてみた結果が上記の表の右端。
衝撃的過ぎると言うか、
そもそも Android アプリの Google Photo の information 表示がおかしくて、
クラウド上の Google Photo を web ブラウザで information 表示した結果は、
PC に取り出したローカルのファイルとも一致しており、
実は何の問題がなかったという落ちである。

つまり、そもそもの問題は何かと言うと、
Office Lens が規定の解像度である 4.1M (2688x1512) はもとより、
7.7M (3200x2400) と 5.0M (2592x1944) の 2 つを除いたすべての解像度において、
スキャン結果をすべて 0.7MP 前後の解像度で保存してしまっているというのが根本的な原因であった。
つまり、指定した解像度を完全に無視していると言うか、
ぶっちゃけ、解像度の指定周りの処理がまともに行われているとは到底思えない状況である。
衝撃的な事実だな、これは。 orz

それはさて置き、不思議極まるのは、
Android アプリ版の Google Photo の information 表示で示される解像度だ。
これは明らかに Office Lens の撮影時に指定した解像度が表示されているのだが、
Windows の explorer のファイルのプロパティをはじめとして、
多くのソフトではこの情報を確認することが出来ない。
おそらく Exif に含まれているはずなんだけど、
単純に ExifTool を使ってみても、
$ exiftool "2018_05_18 10_18 Office Lens (1).jpg"|grep -Ei "res|size|wid|hei"
File Size                       : 130 kB
Resolution Unit                 : None
X Resolution                    : 1
Y Resolution                    : 1
Image Width                     : 720
Image Height                    : 1000
Image Size                      : 720x1000
のように、それらしき情報が見当たらず、
一体どこから引っ張って来てるんだよ!?って状況。

unknown なタグを表示するためのオプションである -u とか -U とかを付けても出て来ないのでしばらく悩んだのだが、
-X オプションを付けてみたところ、ようやく当該のメタデータを見つけることが出来た。
$ exiftool -X "2018_05_18 10_18 Office Lens (1).jpg"|grep -Ei "res|size|wid|hei"
 <System:FileSize>130 kB</System:FileSize>
 <File:ImageWidth>720</File:ImageWidth>
 <File:ImageHeight>1000</File:ImageHeight>
 <IFD0:ImageWidth>3120</IFD0:ImageWidth>
 <IFD0:ImageHeight>4160</IFD0:ImageHeight>
 <JFIF:ResolutionUnit>None</JFIF:ResolutionUnit>
 <JFIF:XResolution>1</JFIF:XResolution>
 <JFIF:YResolution>1</JFIF:YResolution>
 <Composite:ImageSize>720x1000</Composite:ImageSize>
これはどうも ImageWidth と ImageHeight が File と IFD0 のグループで重複しているため IDF0 のグループの値が表示されないらしい。
重複したタグも表示するための -a オプションを用いても表示出来るようだが、
そのままだとグループが併記されず少し分かり難いため -G オプションを併用するのが良さげである。
$ exiftool -a -G "2018_05_18 10_18 Office Lens (1).jpg"|grep -Ei "res|size|wid|hei"
[File]          File Size                       : 130 kB
[File]          Image Width                     : 720
[File]          Image Height                    : 1000
[EXIF]          Image Width                     : 3120
[EXIF]          Image Height                    : 4160
[JFIF]          Resolution Unit                 : None
[JFIF]          X Resolution                    : 1
[JFIF]          Y Resolution                    : 1
[Composite]     Image Size                      : 720x1000

あと、撮影結果のアスペクト比が
  • 2655x1897 (1.400)
  • 3277x2343 (1.399)
  • 1000x720 (1.389)
なのも気にならないわけではないが、
これは A4 のアスペクト比に対して 0.9901%〜1.768% 程度の誤差なので
トリミングの精度を考えると、流石に許容範囲だろうか?

まとめ

  • Office Lens に指定した撮影時の解像度は多くの場合無視され、0.7MP 前後の解像度でスキャン結果の保存が行われる。
  • そのくせ、メタデータには、スキャン結果の解像度ではなく、指定された撮影時の解像度が IFD0 グループに埋め込まれる。
  • Android アプリ版 Google Photo の information 表示は IDF0 グループの ImageWidth と ImageHeight を表示してしまう。
  • このため、Android アプリ版 Google Photo の表示は Office Lens でスキャンされたファイルの実際の解像度を反映してない場合がある。

以上の状況は
  • Office Lens 16.0.9226.2146 (更新日:2018/05/07)
  • Google フォト 3.20.1.196756206 (更新日: 2018/05/17)
で確認した。