« 『のらくロード』を歩いてみた♪ | トップページ | 『さくらドライソーセージ』貰った♪ »

2013年1月31日 (木)

『javascript/exif.js』で日付を得たいのだが…

『javascript』で写真の撮影日を確認するウェブアプリを
考えていたのだが、『exif.js』と言うのがあるので試してみた。

元ねたはこちら。
JavaScriptを使ってExifデータを読み取る「exif.js」

何か良さそうなので、実際に組み込んでみると…
どうも、データの代入が上手くいかない…。

テキストボックスには、『2013:01:20 12:30:21』と表示するのだが
データとして取り出したりすると『2』となる。

しかも、ブラウザによっては、最初から『2』だったりす。

『Firefox』だと『2013:01:20 12:30:21』だが、
『Chrome』は、最初から『2』が表示されるのだ。
『alert』で表示させると文字化けをしている。
『デペロッパーツール』で確認すると『2013:01:20 12:30:21』と表示される。

a    = $date.slice(0, 1);
b    = $date.slice(1, 2);
c    = $date.slice(2, 3);

l    = $date.slice(11, 12);
m    = $date.slice(12, 13);

こんな地道な確認でようやく原因が判明…。

多分C的に書くと『int $date[]』になっていた。
あるいは、文字コードが『UTF-32』と書けば良いのだろうか?

バイナリーで書くとこうなる。
+------- 2 --------++------- 0 --------++------- 1 --------+
0x32,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x31,0x00,0x00,0x00,
+------- 3 --------++------- : --------+ …
0x33,0x00,0x00,0x00,0x3A,0x00,0x00,0x00, …

『UTF-8』だとこうなる。
+ 2 ++ 0 ++ 1 ++ 3 ++ : + …
0x32,0x30,0x31,0x33,0x3A, …

『0x00』は、大抵文字列の終わりを示したりするので…
『2013:01:20 12:30:21(UTF-32)』は、『2(UTF-8)』となった。

と言う訳で、『UTF-32』を『UTF-8』に変換したらOK!
こんな処理で不必要な部分をカット。

    function dateConvert(string) {
        var    length    = string.length;
        var    result    = "";
        for(i=0 ; i<length;i++) {
            code    = string.charCodeAt(i);
            if(code>=32) {
                result    = result + String.fromCharCode(code);
            }
        }
        return result;
    }

    document.form.date.value    =
    dateConvert(Exif.loadFromArrayBuffer(reader.result).ifd0.dateTime)

こちらに動作するHTMLを置いておく。

実行は、クリック。
ダウンロードは、右クリック「名前を付けてダウンロード」。

「sample.html」をダウンロード
「exif.js」をダウンロード

『Javascript』は、設定に合わせて文字コードを変換してくれると
ばかり思っていたので、結構嵌った…。(汗)

|

« 『のらくロード』を歩いてみた♪ | トップページ | 『さくらドライソーセージ』貰った♪ »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/108365/56684515

この記事へのトラックバック一覧です: 『javascript/exif.js』で日付を得たいのだが…:

« 『のらくロード』を歩いてみた♪ | トップページ | 『さくらドライソーセージ』貰った♪ »