Android 7.1以降でデジタルカメラのRAW画像表示に対応

 実はAndroid 7.1以降では、カメラメーカー各社のRAW画像ファイル形式に対応していたようです。

 過去を振り返ってみるとAndroid 5.0でDNGフォーマットでのRAW撮影に対応という進化がありました。ですが、これはAndroidプラットフォームとしてサポートしていても、実際にRAWで記録できるかは各端末メーカーの実装次第であり、一部のハイエンド寄りのモデルを除けば現在に至っても多くのAndroid搭載端末ではRAW撮影は残念ながらできません。

 一方、本投稿タイトルに記した「Android 7.1以降でデジタルカメラのRAW画像表示に対応」の意味するところは、RAW記録の話ではなく、表示の話です。すなわち、撮影機器ではなく画像表示機器としてAndroidバイスを利用する場合の話ですので、混同しないようご注意ください。
 

CDDの定義

 Android搭載機器を製造するメーカー向けにGoogleが公開している互換性定義文書(Compatibility Definition Document; CDD)があります。この中では多様な要求仕様等が定義されているのですが、画像についても定義があります。
 Android 7.1のCDDには「5.1.2. Image Codecs」という項目が追加され、RAWのデコーダがREQUIREDとされました。
https://source.android.com/compatibility/7.1/android-7.1-cdd.pdf

 なお、"REQUIRED"という英語を日本語にすれば「要求されている」という意味になりますが、これは単なる英語ではなく、RFC2119(Key words for use in RFCs to Indicate Requirement Levels)で定義されている用語で、REQUIREDは「その規定が当該仕様の絶対的な 要請事項であることを意味」しています。
 撮影画像のRAW記録(エンコード)は端末メーカーの実装次第でしたが、RAWのデコードは必ずできなければならないと定められているわけですので、Android 7.1以降を搭載したどんな端末でも表示が可能ということになります*1

 なおCDD中で具体的なRAWファイルフォーマットは以下の10種類の拡張子が明示されています。

ARW (.arw), CR2 (.cr2), DNG (.dng), NEF (.nef), NRW (.nrw), ORF (.orf), PEF (.pef), RAF (.raf), RW2 (.rw2), SRW (.srw)

 すなわち、SONY(arw), Canon(cr2), Nikon(nef, nrw), Olympus(orf), Pentax(pef, dng), Fujifilm(raf), Panasonic(rw2), Samsung(srw)といったデジタルカメラメーカー各社のRAW画像形式を幅広く網羅していることになります。対応していないのはSigmaのX3FとLytroのLFRフォーマット位ではないでしょうか。
 

検証

 実際に各社のRAW画像がAndroid端末で表示可能か検証してみます。
 特に断りが無い限り、検証に用いた端末はAndroid 8.0にUpdateしたdocomo AQUOS sense SH-01Kで、プリインストールされているアルバムアプリを使用しています。
 

表示

 あっけなくJPG画像やPNGと同様に普通に表示されました。
RAW image viewed within Android
 ワンテンポ遅れる感じもしますが、一般の画像フォーマット同様にピンチインで拡大表示することもできます。デジタルズームのように画像が荒く表示されるわけでも無いことと、表示がワンテンポ遅れる感じからして、RAWファイル中に含まれるJPEGサムネイルを表示しているわけではなく、きちんと生のRAWデータをデモザイク処理(=現像)して表示しているようです。
RAW image viewed within Android (zoomed)

 続いて、各社のファイルフォーマットごとのプロパティ表示を掲載します。
 

SONY (*.ARW)

SONY ARW property showed by Android Album app
 参考までに、同一画像の撮影日時と解像度をExiftoolで確認すると以下の通り。

======== DSC04229.ARW
Date/Time Original              : 2017/03/30 07:19:49
Image Size                      : 4928x3276

 撮影日時に不要に9時間加算されてしまっている点と、画像解像度の表示が正しくありません。
 

Canon (*.CR2)

Canon CR2 property showed by Android Album app

======== IMG_5088.CR2
Date/Time Original              : 2017/11/02 19:01:18
Image Size                      : 5184x3456

 これも撮影日時に不要に9時間加算されてしまっている点はおかしいですが、画像解像度の表示はあっています。
 

Panasonic (*.RW2)

Panasonic RW2 property showed by Android Album app

======== P1950558.RW2
Date/Time Original              : 2017/12/19 17:32:47
Image Size                      : 4592x3448

 撮影日時に不要に9時間加算されてしまっている点と、画像解像度の表示が正しくありません。
 

Olympus (*.ORF)

Olympus ORF property showed by Android Album app

======== P6234279.ORF
Date/Time Original              : 2017/06/23 09:32:54
Image Size                      : 4640x3472

 撮影日時に不要に9時間加算されてしまっている点と、画像解像度の表示が正しくありません。
 

Samsung (*.SRW)

Samsung SRW property showed by Android Album app

======== SAM_0267.SRW
Date/Time Original              : 2017/11/03 14:33:20
Image Size                      : 5664x3710

 撮影日時に不要に9時間加算されてしまっている点と、画像解像度の表示が正しくありません。
 

まとめ

 NikonFujifilmは未検証ですが、ハイエンドではない普通のAndroid8.0搭載スマートフォンデジタルカメラメーカー各社のRAW画像が実用的なパフォーマンスで表示可能な事が判りました。
 デジタルカメラの液晶画面より大きな画面でピントチェックするような用途には使えるかと思います(RAW画像を高速にスマートフォンまで持ってくる手段があればですが…)。
 ただし、Canon CR2以外のファイルフォーマットでは解像度の表示がおかしなことになっていたり、検証した全てのRAW画像形式で撮影日時が9時間ズレていますので、これらの情報の確認用途では使えません。

撮影日時表示9時間ズレの原因

 日本標準時UTC+9:00であることから、端末のタイムゾーン情報を取得してそれをExifのDateTimeOriginalに加算してしまっているのではないかと推測しました。
 試しに端末のタイムゾーン設定を、日本標準時(+9:00)からアゾレス(+00:00)に変えてみたところ、撮影日時は正しい値が表示されるようになるかと思いきや、何故か今度は1時間前にズレました(スクリーンショットは前掲のPanasonic RW2をタイムゾーン変更後に表示させたもの)。
Panasonic RW2 property showed by Android Album app after timezone change

 アゾレスを調べてみるとどうやらサマータイムがあるようで、サマータイム期間中がUTC+0で、サマータイム期間外はUTC-1となるタイムゾーンのようです。スクリーンショット取得時(2018/3/29)はアゾレスのサマータイム期間中のため、1時間ズレは起きないはずですが、画像撮影日(2017/12/19)はサマータイム期間ではありません。

 つまり、画像ファイルに記録されたEXIFの画像撮影日時(DateTimeOriginal等)に、Android端末のタイムゾーン設定をExifの画像撮影日時当時のサマータイム状況を加味して加算という面倒な処理が行われていそうです。そんなことせずに、EXIFの画像撮影日時をそのまま表示してくれればいいだけなんですけどね。

 そもそも、EXIFのDateTimeOriginalキーにはタイムゾーン情報が記録されていないのがカオスの元凶な気もします。ということで、少し調べてみると2016年7月に公開されたExif仕様2.31でOffsetTime/OffsetTimeOriginal/OffsetTimeDigitizedという3つのキーが新設され、UTCからの時差情報を保持できるようになったようです。
 とは言え、デジタルカメラ自体がサポートしなければ当該タグは記録されません。今回検証に使用したRAW画像には何れもこれらのキーは記録されていませんでした(が、Canon CR2だけは独自に追加したと思われるTimeZoneキーを持っており、日本標準時を表す+9:00が記録されていましたが、EXIF規格のキーではないためか無視されてます。OffsetTime/OffsetTimeOriginal/OffsetTimeDigitizedキーが存在した場合も、Androidが正しくハンドリングしてくれるのかは不明ですが)。
 
 そもそも、このプロパティ表示のバグがAndroidそのもののバグなのかは切り分けできていません。SH-01Kにプリインストールされているアルバムアプリは、「アルバム」とアプリアイコンの下に表示されてこそいるものの、Android標準のアプリではなく、正確にはSHアルバムというSHARPの手が加えられた(或いはSHARPが独自に開発した)アプリのようです。このため、SHアルバム固有のバグなのかもしれません。
 ということで、試しにGoogleのPhotosアプリ(Google Photos)でRAW画像を開いてみると、画像は開けるのですがピンチインできず拡大できない、プロパティ表示(メタデータ表示)もできないというレベルでした。他にも画像表示機能があるサードパーティのファイラーアプリ(File Commandar)で開いてみようとしたところ、JPGやPNGとは異なり上記のRAWファイルは開けませんでした。
 ですので、プラットフォームとしてAndroid 7.1以降でデジタルカメラのRAWフォーマットに対応したことは間違いありませんが、アプリによってサポートレベルはまちまちのようです。
 



以上。

*1:Android 8.0や最新のAndroid 8.1のCDDにおいても同様の内容が掲載されています。