HTML5Rocksに関するこの記事を参照して、Webカメラから写真を撮るユーティリティを構築しようとしています。
以下は私のHTMLコードスニペットです。
<button type="button" name="btnCapture" id="btnCapture">Start my camera</button><br />
<video autoplay="true" id="video" style="height:240px;width:320px"></video><canvas id="canvas" style="display: none; height:240px;width:320px"></canvas><br />
<img id="capturedImage" src="/blank.gif" style="height:240px;width:320px"><input type="hidden" id="hdnImageBase64" name="hdnImageBase64"><br />
ボタンbtnCapture
をクリックすると、Webカメラを起動してもう一度クリックします。Webカメラから写真をキャプチャして画像に配置しますcapturedImage
。
以下は私のJavaScriptコードです。
var video = document.getElementById("video");
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var localMediaStream = null;
var capturedImage = document.getElementById("capturedImage");
var buttonTextCapturePicture = "Say Cheese!";
function onFailSoHard(e) {
if (e.code == 1) {
alert("Something went wrong! Either your webcam is not connected or you denied access to it.");
} else {
alert("getUserMedia() not supported in your browser. Try using latest version of Google Chrome or Opera.");
}
}
function snapshot() {
if (localMediaStream) {
try {
ctx.drawImage(video, 0, 0);
capturedImage.src = canvas.toDataURL("image/png");
document.getElementById("hdnImageBase64").value = canvas.toDataURL("image/png");
} catch (e) {
alert("Something went wrong while capturing you. Try refreshing the page. " + e);
}
}
}
video.addEventListener("click", snapshot, false);
function sizeCanvas() {
setTimeout( function() {
canvas.width = video.videoWidth;
canvas.height = video.videoHeight;
capturedImage.height = video.videoHeight;
capturedImage.width = video.videoWidth;
}, 50);
}
var button = document.getElementById("btnCapture");
button.addEventListener("click", function(e) {
if (localMediaStream) {
snapshot();
return;
}
if (navigator.getUserMedia) {
navigator.getUserMedia("video", function(stream) {
video.src = stream;
localMediaStream = stream;
sizeCanvas();
button.textContent = buttonTextCapturePicture;
}, onFailSoHard);
} else if (navigator.webkitGetUserMedia) {
navigator.webkitGetUserMedia({"video" : true}, function(stream) {
video.src = window.webkitURL.createObjectURL(stream);
localMediaStream = stream;
sizeCanvas();
button.textContent = buttonTextCapturePicture;
}, onFailSoHard);
} else {
onFailSoHard({
target : video
});
}
}, false);
ボタンbtnCapture
を最初にクリックすると、関数が呼び出さsizeCanvas()
れ、キャンバスと画像の幅と高さがビデオの幅と高さ(つまり、320と240)に設定されます。ボタンを2回クリックすると、を使用してWebカメラからBase64でエンコードされたスナップショットを取得canvas.toDataURL
し、画像に配置しますcapturedImage
。
Operaで動作します。ただし、Google Chromeでは、ページが最初に読み込まれたときに常に失敗します。ただし、同じページが更新されると機能します。デバッグしようとすると、コードが初めてcanvas.toDataURL
画像Base64を返すことがわかりました。これにより、画像を描画できず、コンソールでエラーが発生します。また、関数を呼び出さないと、最初は機能しますが、画像が必要なサイズではなく、トリミングされます。data:,
Resource interpreted as Image but transferred with MIME type text/plain: "data:,".
sizeCanvas
Chromeで初めてChromeで動作させる方法はありsizeCanvas
ますか?
Google Chrome:24.0.1312.57 Opera:12.11