このエントリーはtech.kayac.com Advent Calendar 2013の14日目のエントリーです。
こんにちは!昨日後頭部をぐにょんぐにょんにされた@shogo82148です。
「Redis::Fastを本番投入したらメモリーリークして3時間半で駆逐された件」でも 書こうと思ってたんですが、悲しくなるだけなので予定変更することにしました。 昨日の記事には「(Androidで)」と書いてあったので、 きっと皆さん続編を期待していらっしゃることでしょう。 ぐにょんぐにょんにされたままでは悔しいので、僕もぐにょんぐにょんにして遊んでみることにします。 お手がるにJavascriptで。
スリットスキャン
昨日の記事より再掲。こんなの作ります。
本日の流れ
- WebRTCを使ってカメラを扱う
- Canvasでbyte配列を扱う
- スリットスキャンにする
WebRTCを使ってカメラを扱う
Javascriptからカメラを扱うには、WebRTC(Web Real Time Communication)というものを使います。 使い方は簡単で、カメラの使用リクエストを出して、帰ってきたオブジェクトをVideo Elementに入れるだけです。 (現在のところgetUserMediaとURLにはベンダープレフィックスが必要です。)
navigator.getUserMedia(
{ video: true }, // constrains: 接続先のデバイス
function successCallback(stream) { // アクセス成功!
var video = document.getElementById('video');
video.src = URL.createObjectURL(stream);
video.autoplay = true;
},
function errorCallback() { // エラー!! }
);
これだけで、カメラの映像をブラウザ上で確認することができます。
Canvasでbyte配列を扱う
Video Element 上で再生されているだけではつまらないので、Canvas上に描画します。
var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');
requestAnimationFrame(function render() {
context.drawImage(video, 0, 0, width, height);
requestAnimationFrame(render);
});
Canvas上に描かれたものは getImageData で簡単に取得できます。
var image_data = context.getImageData(0, 0, width, height);
var data = imgage_data.data; // RGBAの形式でbyte列が格納される
スリットスキャンにする
できた!!
おわり
ついJavascriptで遊んでしまいましたが、普段はサーバサイドでPerlいじってます。 Redis::Fastのメモリーリーク直してくれるやさしい人からの プルリクエストをお待ちしてます!
明日は@handlename先輩です。