Androidアプリ開発 ExifInterfaceでExif情報を読み込む [Androidアプリ AREarthroid]
本日は、Androidネタである。ご存じのように、デジカメで撮影した画像データには、Exifデータが添付される。Exifデータには、撮影日時やデジカメの機種、露出、などの情報が含まれている。
スマホを含む携帯電話で撮影すると、位置情報がExifデータとして画像データに含まれる。もちろん、GPS付きの携帯電話じゃないと、位置情報は含まれない。位置情報は、緯度と経度。
Androidで撮影すると、位置情報が画像データに含まれるわけである。これをAREarthroidでその位置に表示できたら、かっこいいかなぁ、ということでExif情報の取得について調べてみることに。
Exifデータは、画像データに含まれている。インテントで画像ファイルを受け取れるようにすれば、OKなはず。
インテントで受けた画像データをExifInterfaceクラスに渡してやるとExifデータを取得できる模様。
http://techbooster.jpn.org/andriod/multimedia/3098/
によると、
とのこと。AREarthroidは、2.2以降なので、問題なし。
取得したいのは、GPSLatitudeとGPSLongitudeなのだが、これはどのバージョンからサポートされているのかなぁ...
http://y-anz-m.blogspot.jp/2011/03/exif.html
によると、
Y.A.MさんのところはAndroidの情報量がすごい。Android女子部に入ってみたい気もするが、オジサンはだめか。
2.3以降なら、高度情報も取れるのか。もちろん、画像データに入っていればっていう話ではあるが。
えーと、どうすればいいのかっていうと、ExifInterfaceクラスのインスタンスを作って、getAttributeIntや、getAttributeで欲しい情報のタグを指定すれば戻ってくるのね。了解。
タグは、TAG_GPS_LATITUDE、TAG_GPS_LONGITUDE、TAG_GPS_ALTITUDEの3つか...
TAG_GPS_LATITUDE_REF、TAG_GPS_LONGITUDE_REF、TAG_GPS_ALTITUDE_REFも必要なのか。
こいつらは、文字列なのね。了解。
ExitInterfaceクラスをnewするときに、IOExceptionが発生するかも知れないので、tryで囲むのね。了解。
よしやってみよう。
とここまで書いたが、文字列形式の緯度、経度ってどんな形式?
緯度 : "num1/denom1,num2/denom2,num3/denom3" 形式のフォーマット
とY.A.Mさんのページに書いてある。
カンマ区切りで時,分,秒なのか。/はどういうこと?
とりあえずは、ログに出してみよう。
05-25 09:05:00.680: V/EXIF(921): latitudeRef=N
05-25 09:05:00.680: V/EXIF(921): latitude=35/1,49/1,13446/1000
05-25 09:05:00.680: V/EXIF(921): longitudeRef=E
05-25 09:05:00.680: V/EXIF(921): longitude=142/1,43/1,10623/1000
05-25 09:05:00.680: V/EXIF(921): altitudeRef=0
05-25 09:05:00.680: V/EXIF(921): altitude=0/1
緯度、経度で自宅の場所がバレバレなのも困るので、数値は変えてある。
latitudeRefはNが入っているこれは、間違いなく北緯のN。
latitudeは、やはり時,分,秒。時と分は/1。35度49分っていうことなのであろう。13446/1000っていうのが秒なのだが、これって13.446秒っていうことなのかな。
高度については0。
よし、わかった。以下のようなコードを書いてみた。
実行させてみたところ、あってそうなので、AREarthroidにも組み込んでみることにする。
(ver 1.2.7には組み込み済み)
サイト内を検索
スマホを含む携帯電話で撮影すると、位置情報がExifデータとして画像データに含まれる。もちろん、GPS付きの携帯電話じゃないと、位置情報は含まれない。位置情報は、緯度と経度。
Androidで撮影すると、位置情報が画像データに含まれるわけである。これをAREarthroidでその位置に表示できたら、かっこいいかなぁ、ということでExif情報の取得について調べてみることに。
Exifデータは、画像データに含まれている。インテントで画像ファイルを受け取れるようにすれば、OKなはず。
インテントで受けた画像データをExifInterfaceクラスに渡してやるとExifデータを取得できる模様。
http://techbooster.jpn.org/andriod/multimedia/3098/
によると、
ExifInterfaceクラスはAndroid2.0(API5)から追加されたクラスです。さらに、Android2.2(API8)、Android2.3(API9)、Android3.0(Honeycomb)でそれぞれ取得出来るExifのタグが増えています。
とのこと。AREarthroidは、2.2以降なので、問題なし。
取得したいのは、GPSLatitudeとGPSLongitudeなのだが、これはどのバージョンからサポートされているのかなぁ...
http://y-anz-m.blogspot.jp/2011/03/exif.html
によると、
* Android 2.3 ・ JPEG ファイルの EXIF メタデータで新しく altitude tag (高度情報)に対応した ・ EXIF altitude tag の値を取得するために新しく getAltitude() メソッドが追加された http://developer.android.com/sdk/android-2.3.html#api の Mixable audio effects 部分
Y.A.MさんのところはAndroidの情報量がすごい。Android女子部に入ってみたい気もするが、オジサンはだめか。
2.3以降なら、高度情報も取れるのか。もちろん、画像データに入っていればっていう話ではあるが。
えーと、どうすればいいのかっていうと、ExifInterfaceクラスのインスタンスを作って、getAttributeIntや、getAttributeで欲しい情報のタグを指定すれば戻ってくるのね。了解。
タグは、TAG_GPS_LATITUDE、TAG_GPS_LONGITUDE、TAG_GPS_ALTITUDEの3つか...
TAG_GPS_LATITUDE_REF、TAG_GPS_LONGITUDE_REF、TAG_GPS_ALTITUDE_REFも必要なのか。
こいつらは、文字列なのね。了解。
ExitInterfaceクラスをnewするときに、IOExceptionが発生するかも知れないので、tryで囲むのね。了解。
よしやってみよう。
try { ExifInterface exifInterface = new ExifInterface(filename); String latitudeRef = exifInterface.getAttribute(ExifInterface.TAG_GPS_LATITUDE_REF); String latitude = exifInterface.getAttribute(ExifInterface.TAG_GPS_LATITUDE); String longitudeRef = exifInterface.getAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF); String longitude = exifInterface.getAttribute(ExifInterface.TAG_GPS_LONGITUDE); String altitudeRef = exifInterface.getAttribute(ExifInterface.TAG_GPS_ALTITUDE_REF); String altitude = exifInterface.getAttribute(ExifInterface.TAG_GPS_ALTITUDE); } catch (Exception ex) { ex.printStackTrace(); }
とここまで書いたが、文字列形式の緯度、経度ってどんな形式?
緯度 : "num1/denom1,num2/denom2,num3/denom3" 形式のフォーマット
とY.A.Mさんのページに書いてある。
カンマ区切りで時,分,秒なのか。/はどういうこと?
とりあえずは、ログに出してみよう。
05-25 09:05:00.680: V/EXIF(921): latitudeRef=N
05-25 09:05:00.680: V/EXIF(921): latitude=35/1,49/1,13446/1000
05-25 09:05:00.680: V/EXIF(921): longitudeRef=E
05-25 09:05:00.680: V/EXIF(921): longitude=142/1,43/1,10623/1000
05-25 09:05:00.680: V/EXIF(921): altitudeRef=0
05-25 09:05:00.680: V/EXIF(921): altitude=0/1
緯度、経度で自宅の場所がバレバレなのも困るので、数値は変えてある。
latitudeRefはNが入っているこれは、間違いなく北緯のN。
latitudeは、やはり時,分,秒。時と分は/1。35度49分っていうことなのであろう。13446/1000っていうのが秒なのだが、これって13.446秒っていうことなのかな。
高度については0。
よし、わかった。以下のようなコードを書いてみた。
private double ExifHourMinSecToDegrees(String exifhourminsec) { String hourminsec[] = exifhourminsec.split(","); String hour[] = hourminsec[0].split("/"); String min[] = hourminsec[1].split("/"); String sec[] = hourminsec[2].split("/"); double dhour = (double)Integer.parseInt(hour[0]) / (double)Integer.parseInt(hour[1]); double dmin = (double)Integer.parseInt(min[0]) / (double)Integer.parseInt(min[1]); double dsec = (double)Integer.parseInt(sec[0]) / (double)Integer.parseInt(sec[1]); double degrees = dhour + dmin / 60.0 + dsec / 3600.0; return degrees; } private double ExifLatitudeToDegrees(String ref, String latitude) { return ref.equals("S") ? -1.0 : 1.0 * ExifHourMinSecToDegrees(latitude); } private double ExifLongitudeToDegrees(String ref, String longitude) { return ref.equals("W") ? -1.0 : 1.0 * ExifHourMinSecToDegrees(longitude); }
実行させてみたところ、あってそうなので、AREarthroidにも組み込んでみることにする。
(ver 1.2.7には組み込み済み)
サイト内を検索
タグ:Android
2012-06-06 15:19
nice!(0)
コメント(0)
Copyright Atsushi Asai Google+朝井淳
[データベースの気持ちがわかる]SQLはじめの一歩 (WEB+DB PRESS plus)
- 作者: 朝井 淳
- 出版社/メーカー: 技術評論社
- 発売日: 2015/03/03
- メディア: 単行本(ソフトカバー)
Access クエリ 徹底活用ガイド ~仕事の現場で即使える
- 作者: 朝井 淳
- 出版社/メーカー: 技術評論社
- 発売日: 2018/05/25
- メディア: 大型本
コメント 0