SSブログ

Androidアプリ開発 ExifInterfaceでExif情報を読み込む [Androidアプリ AREarthroid]

本日は、Androidネタである。ご存じのように、デジカメで撮影した画像データには、Exifデータが添付される。Exifデータには、撮影日時やデジカメの機種、露出、などの情報が含まれている。
スマホを含む携帯電話で撮影すると、位置情報が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
nice!(0)  コメント(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。



Copyright Atsushi Asai Google+朝井淳
[改訂第4版]SQLポケットリファレンス

[改訂第4版]SQLポケットリファレンス

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/02/18
  • メディア: 単行本(ソフトカバー)

イラストで理解 SQL はじめて入門

イラストで理解 SQL はじめて入門

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2019/05/16
  • メディア: 単行本(ソフトカバー)

[データベースの気持ちがわかる]SQLはじめの一歩 (WEB+DB PRESS plus)

[データベースの気持ちがわかる]SQLはじめの一歩 (WEB+DB PRESS plus)

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2015/03/03
  • メディア: 単行本(ソフトカバー)

Access クエリ 徹底活用ガイド ~仕事の現場で即使える

Access クエリ 徹底活用ガイド ~仕事の現場で即使える

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2018/05/25
  • メディア: 大型本

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。