5

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

4

1 に答える 1

8

ライブデモ

ChromeとFFでうまく機能します。

(function() {

  var streaming = false,
      video        = document.querySelector('#video'),
      canvas       = document.querySelector('#canvas'),
      photo        = document.querySelector('#photo'),
      startbutton  = document.querySelector('#startbutton'),
      width = 320,
      height = 0;

  navigator.getMedia = ( navigator.getUserMedia ||
                         navigator.webkitGetUserMedia ||
                         navigator.mozGetUserMedia ||
                         navigator.msGetUserMedia);

  navigator.getMedia(
    {
      video: true,
      audio: false
    },
    function(stream) {
      if (navigator.mozGetUserMedia) {
        video.mozSrcObject = stream;
      } else {
        var vendorURL = window.URL || window.webkitURL;
        video.src = vendorURL.createObjectURL(stream);
      }
      video.play();
    },
    function(err) {
      console.log("An error occured! " + err);
    }
  );

私がここで見つけたこのコード:LINK DEVELOPER MOZILLA

更新:getUserMedia()安全でないオリジンでは機能しなくなったため、ライブデモをJSFiddleに更新しました。この機能を使用するには、アプリケーションをHTTPSなどの安全なオリジンに切り替えることを検討する必要があります。詳細については、Chromiumプロジェクトを参照してください。

于 2013-10-28T10:11:48.250 に答える