忍者ブログ

アンドロイドのあれこれ

Photo Sphereに任意の写真を取り込んでみて360度回転させる
Photo Sphere はAndroid 4.2 のカメラアプリに追加されたものです。Googleストリートビューのような360度パノラマが端末で撮影できます。
残念ながら自分の手元には4.2のスマートフォンがないのですぐに試したくても試せないです。



Photo SphereはGoogle Play Servicesのライブラリーです。Android用のPlay Services 2.0からPhoto Sphere APIが追加されAndroid 2.2以上動作可能のようです。
Google Play Services

Photo Sphere APIを使ったのサンプルコードは
android-sdks/extras/google/google_play_services/samples/panorama
にあります。動かすには
android-sdks/extras/google/google_play_services/libproject/google-play-services_lib
も必要です。

Google Play Services Library

サンプルのなかには対応しているサンプルのパノラマの写真からPhoto Sphereの表示しています。
任意の写真をPhoto Sphereに取り込んで表示させるためには、写真のサイズやメタ情報などをあわせないといけません。
まずはサンプルに入っている写真を調べます。Ubuntu環境でexiv2のコマンドを使って写真のメタ情報の表示・編集ができます。

/res/raw/pano1.jpg

$ exiv2 -p a pano1.jpg
Exif.Image.Model Ascii 14 Galaxy Nexus
Exif.Image.Orientation Short 1 (0)
Exif.Image.DateTimeOriginal Ascii 20 2012:11:07 11:06:03
Exif.Image.MeteringMode Short 1 (65535)
Exif.Image.ImageLength Short 1 1254
Exif.Image.DateTime Ascii 20 2012:11:07 11:06:03
Exif.Image.LightSource Short 1 Unknown
Exif.Image.ImageWidth Short 1 2508
Exif.Image.Make Ascii 8 Samsung
Exif.Image.GPSTag Long 1 240
Exif.GPSInfo.GPSTimeStamp SRational 3 11:03:09
Exif.GPSInfo.GPSLatitudeRef Ascii 2 North
Exif.GPSInfo.GPSLongitude Rational 3 156deg 55' 22.868"
Exif.GPSInfo.GPSLongitudeRef Ascii 2 West
Exif.GPSInfo.GPSDateStamp Ascii 11 2012:11:07
Exif.GPSInfo.GPSProcessingMethod Undefined 1 0
Exif.GPSInfo.GPSLatitude Rational 3 20deg 49' 27.109"
Exif.GPSInfo.GPSAltitudeRef Byte 1 Above sea level
Exif.Image.ExifTag Long 1 425
Xmp.GPano.UsePanoramaViewer XmpText 4 True
Xmp.GPano.ProjectionType XmpText 15 equirectangular
Xmp.GPano.PoseHeadingDegrees XmpText 5 350.0
Xmp.GPano.CroppedAreaLeftPixels XmpText 1 0
Xmp.GPano.FullPanoWidthPixels XmpText 4 4000
Xmp.GPano.CroppedAreaTopPixels XmpText 1 0
Xmp.GPano.FirstPhotoDate XmpText 24 2012-11-07T21:03:13.465Z
Xmp.GPano.CroppedAreaImageHeightPixels XmpText 4 2000
Xmp.GPano.FullPanoHeightPixels XmpText 4 2000
Xmp.GPano.SourcePhotosCount XmpText 2 50
Xmp.GPano.CroppedAreaImageWidthPixels XmpText 4 4000
Xmp.GPano.LastPhotoDate XmpText 24 2012-11-07T21:04:10.897Z
Xmp.GPano.LargestValidInteriorRectLeft XmpText 1 0
Xmp.GPano.LargestValidInteriorRectTop XmpText 1 0
Xmp.GPano.LargestValidInteriorRectWidth XmpText 4 4000
Xmp.GPano.LargestValidInteriorRectHeight XmpText 4 2000

画像のメタ情報が出てきました。Photo Sphereで使われている XMP Metadataは以下のリンクから詳細が載っています。
Panorama XMP Metadata - https://developers.google.com/panorama/metadata/

適当に以上のXmp.GPanoなど含めたメタ情報を、別に用意している画像に exiv2 コマンドで取り込みます。
exiv2 -d a imagefile で画像のメタ情報を全て削除してから
$ exiv2 -d a mypano01.jpg 
$ exiv2 -m demo-xmp.txt mypano01.jpg

demo-xml.txtファイル
reg GPano http://ns.google.com/photos/1.0/panorama/

set Xmp.GPano.UsePanoramaViewer XmpText True
set Xmp.GPano.ProjectionType XmpText equirectangular
set Xmp.GPano.CroppedAreaImageWidthPixels XmpText 4096
set Xmp.GPano.CroppedAreaImageHeightPixels XmpText 2048
set Xmp.GPano.FullPanoWidthPixels XmpText 4096
set Xmp.GPano.FullPanoHeightPixels XmpText 2048
set Xmp.GPano.CroppedAreaLeftPixels XmpText 0
set Xmp.GPano.CroppedAreaTopPixels XmpText 0
set Exif.Image.Model Ascii Galaxy Nexus
set Exif.Image.Orientation Short 0
set Exif.Image.DateTimeOriginal Ascii 2012:11:07 11:06:03
set Exif.Image.ImageLength Short 1254
set Exif.Image.DateTime Ascii 2012:11:07 11:06:03
set Exif.Image.ImageWidth Short 2508
set Exif.Image.Make Ascii Samsung
set Exif.Image.GPSTag Long 240
set Exif.Image.ExifTag Long 425
set Xmp.GPano.UsePanoramaViewer XmpText True
set Xmp.GPano.ProjectionType XmpText equirectangular
set Xmp.GPano.PoseHeadingDegrees XmpText 350.0
set Xmp.GPano.CroppedAreaLeftPixels XmpText 0
set Xmp.GPano.FullPanoWidthPixels XmpText 4000
set Xmp.GPano.CroppedAreaTopPixels XmpText 0
set Xmp.GPano.FirstPhotoDate XmpText 2012-11-07T21:03:13.465Z
set Xmp.GPano.CroppedAreaImageHeightPixels XmpText 2000
set Xmp.GPano.FullPanoHeightPixels XmpText 2000
set Xmp.GPano.SourcePhotosCount XmpText 50
set Xmp.GPano.CroppedAreaImageWidthPixels XmpText 4000
set Xmp.GPano.LastPhotoDate XmpText 2012-11-07T21:04:10.897Z
set Xmp.GPano.LargestValidInteriorRectLeft XmpText 0
set Xmp.GPano.LargestValidInteriorRectTop XmpText 0
set Xmp.GPano.LargestValidInteriorRectWidth XmpText 4000
set Xmp.GPano.LargestValidInteriorRectHeight XmpText 2000


次に、ベタ情報をパクって取り込んだ画像をPhoto Sphereのプロジェクトにコピーしてソースコードを少しだけ修正します。
PanoramaSampleActivity.javaの54行目くらい
...
@Override
public void onConnected() {
// Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.pano1);
Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.mypano01);
mClient.loadPanoramaInfo(this, uri);
}
...


Android 4.2の端末で実行してみると取り込んだ画像が360度回転できます。表示されなかったら画像のサイズを調整してみてください。
ちなみにPhoto Sphereで画像をググってみると対応しているパノラマもあるので、それを取り込んで遊んでみてください。メタ情報が入っていなかったら上記のやり方でちゃんとメタ情報をつけていれば表示できるはずです。

ググって見つけたPhoto Sphere対応のパノラマ
http://cdn.thenextweb.com/wp-content/blogs.dir/1/files/2012/11/PANO_20121101_172336.jpg
http://phandroid.s3.amazonaws.com/wp-content/uploads/2012/11/building-44-photo-sphere-2.jpeg
http://highonandroid.com/img/photosphere.jpg
COMMENT
NAME
TITLE
MAIL (非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS (コメント編集に必須です)
SECRET
管理人のみ閲覧できます
 
PR
© Android Advent
powered by 忍者ツールズ / 忍者ブログ / [PR]