スタートページJavascriptEXIF

JPEG画像のURLを与えてEXIFを読込み
緯度、経度、撮影日時を得る

謝辞:Jacob Seidelin 氏開発の Javascript EXIF Reader 0.1.4 をアカベコ氏が改変したMPLのJSライブラリを使わせていただきました。これに関しては、「EXIFの概要」 をご参照ください。


画像URL 緯度 経度 撮影日時

表示されない場合は、再度クリックしてください。


ソースリスト

●jsライブラリ

<script src="exifjs/binaryajax.js"></script>
<script src="exifjs/exif.js"></script>

●スクリプト

function 画像指定() {
    // HTMLから対象となるJPEGファイルのURLを受け取る
    var 画像URL = document.form1.画像URL.value;
    緯度経度取得(画像URL);
};     // ↓
       // ↓ 呼出し
       // ↓
function 緯度経度取得(画像URL) {
    // A:JPEGファイル「sample.jeg」をImageオブジェクト「画像」として定義する
    var 画像 = new Image();      
    画像.src = 画像URL;

    // B:ライブラリにあるgetAllTags()を呼び出してEXIF情報を取得する。
    var EXIF情報 = new Exif(画像);
    EXIF情報.load( function() {
        var タグ値 = EXIF情報.getAllTags();

        // 取得結果は 連想配列 タグ値[タグ名] に保存される。
        // C:このタグ名は jsライブラリ で定められている(後述「EXIFタグ名」参照)
        var 緯度分秒 = タグ値["GPSLatitude"];  // 緯度・経度は「度,分,秒」の形式になっている
        var 経度分秒 = タグ値["GPSLongitude"];
        var 日時 = タグ値["GPSDateStamp"];
        // D
        緯度経度加工(緯度分秒, 経度分秒, 日時);      // ★「要改良点」参照
    });   // ↓
};        // ↓ 呼出し
          // ↓
function 緯度経度加工(緯度分秒, 経度分秒, 日時) {
    // E:度分秒を十進に変換
    var 度分秒 = String(緯度分秒).split(",");
    var 緯度 = 度分秒[0]/1 + 度分秒[1]/60 + 度分秒[2]/3600;
    度分秒 = String(経度分秒).split(",");
    var 経度 = 度分秒[0]/1 + 度分秒[1]/60 + 度分秒[2]/3600;
    // F:HTMLのフォームに出力
    document.form1.緯度出力場所.value = 緯度;
    document.form1.経度出力場所.value = 経度;
    document.form1.日時出力場所.value = 日時;
};

●HTML

<form name="form1">
    // 入力部 画像URL=sample.JPG を引数として、関数「画像指定」を呼び出す
    画像URL<input type="text" id="画像URL" value="sample.JPG"></input>
    <input type="button" value="実行" onClick="画像指定()"></input>
    // 出力部 関数「緯度経度加工」より出力される
    緯度<input type="text" id="緯度出力場所"></input>
    経度<input type="text" id="経度出力場所"></input>
    撮影日時<input type="text" id="日時出力場所"></input>
</form>

解説

ここでは、非常に簡単な例として、画像ファイルのURLを与えて、そのEXIF情報を読み、緯度、経度、撮影日時を表示する。

処理の流れ

  1. まえもって、JSライブラリを定義しておく。
  2. HTMLから「画像URL」(画像ファイルのURL。ここでは sammple.JPG)を設定して、関数「画像指定」を呼び出す。
  3. 関数「画像指定」では、単に関数「緯度経度取得」に「画像URL」を渡すだけである→「要改良点」
  4. 関数「緯度経度取得」では、Aで、対象画像を Imageオブジェクト として定義する。
  5. Bの
      EXIF情報.load( function() {
        var タグ値 = EXIF情報.getAllTags();
          :
      });
    がポイントである。この「EXIF情報」や「タグ値」の名称は任意であるが、これにより、EXIFの情報が連想配列「タグ値[タグ名]」に取り入れられる。
  6. Cでは多様なタグがある→参照「EXIFの概要」。もし ファイルの変更日時 が必要ならば、
        var 変更日時 = タグ値["DateTime"]
    とすればよい。
  7. Dで、関数「緯度経度加工」を呼び出す。Eでは緯度などが度分秒の形式になっているが、GoogleMapなどでは十進数にしたほうが便利なので、それをEで行う。ここでの
        度分秒 = String(緯度分秒).split(",");
    は、緯度分秒を「,」で分離するもので、度分秒[0]は度、度分秒[1]は分、度分秒[2]は秒になる。、
  8. Fで、結果をHTMLに出力する。その後、制御は関数「緯度経度取得」に戻り、さらに関数「画像指定」に戻ってスクリプトは終了する。

要改良点

本来ならば、「緯度」「経度」「日時」の値をメインプログラム「画像指定」で受け取ることにより、多様な処理ができる。それなのに、このプログラムでは、呼ばれた先の関数「緯度経度加工」から結果をHTMLに出力している。そのため、他の処理につなげるには、出力データを再度入力しなければならない。

本来のようにするには、★行を return (緯度, 経度, 日時) として「画像指定」に渡せればよいのであるが、どういうわけか受け取れないのである。ご教示頂ければ幸甚である。