『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』は、設定に合わせて文字コードを変換してくれると
ばかり思っていたので、結構嵌った…。(汗)
| 固定リンク | コメント (0) | トラックバック (0)
最近のコメント