Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@anantn
Created February 17, 2012 09:12
Show Gist options
  • Star 46 You must be signed in to star a gist
  • Fork 10 You must be signed in to fork a gist
  • Save anantn/1852070 to your computer and use it in GitHub Desktop.
Save anantn/1852070 to your computer and use it in GitHub Desktop.
Take a picture with getUserMedia
<html>
<body>
<video id="v" width="300" height="300"></video>
<input id="b" type="button" disabled="true" value="Take Picture"></input>
<canvas id="c" style="display:none;" width="300" height="300"></canvas>
</body>
<script>
navigator.getUserMedia({video: true}, function(stream) {
var video = document.getElementById("v");
var canvas = document.getElementById("c");
var button = document.getElementById("b");
video.src = stream;
button.disabled = false;
button.onclick = function() {
canvas.getContext("2d").drawImage(video, 0, 0, 300, 300, 0, 0, 300, 300);
var img = canvas.toDataURL("image/png");
alert("done");
};
}, function(err) { alert("there was an error " + err)});
</script>
</html>
@Jackbennett
Copy link

Commenting this old gist as it's a good google rank. Line 13 needs to be the following in order the stream the video preview.

      video.srcObject = stream;
      video.play();

@TobiasSeitz
Copy link

I ran into some problems when I tried this gist on Chrome > v55:

  1. The navigator.getUserMedia() method is deprecated in favor of navigator.mediaDevices.getUserMedia() (https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia, no more prefixes!).
  2. As noted by @Jackbennett, video.src = stream fails and should be replaced with a valid URL, that we can generate like this:
video.src = window.URL.createObjectURL(stream);
  1. I needed to dynamically create and resize the canvas to take the full picture of the webcam.

Here's a working example (tested on Chrome 55, Firefox 51):

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>HTML5 Media Device Access</title>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <style>
    video, img {
      max-width:100%;
    }
  </style>
</head>
<body>

<video autoplay></video>

<script>
  (function() {
    'use strict';
    var video = document.querySelector('video')
      , canvas;

    /**
     *  generates a still frame image from the stream in the <video>
     *  appends the image to the <body>
     */
    function takeSnapshot() {
      var img = document.querySelector('img') || document.createElement('img');
      var context;
      var width = video.offsetWidth
        , height = video.offsetHeight;

      canvas = canvas || document.createElement('canvas');
      canvas.width = width;
      canvas.height = height;

      context = canvas.getContext('2d');
      context.drawImage(video, 0, 0, width, height);

      img.src = canvas.toDataURL('image/png');
      document.body.appendChild(img);
    }

    // use MediaDevices API
    // docs: https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia
    if (navigator.mediaDevices) {
      // access the web cam
      navigator.mediaDevices.getUserMedia({video: true})
      // permission granted:
        .then(function(stream) {
          video.src = window.URL.createObjectURL(stream);
          video.addEventListener('click', takeSnapshot);
        })
        // permission denied:
        .catch(function(error) {
          document.body.textContent = 'Could not access the camera. Error: ' + error.name;
        });
    }
  })();

</script>
</body>
</html>

@jan-ivar
Copy link

jan-ivar commented Feb 19, 2017

@TobiasSeitz Please replace video.src = window.URL.createObjectURL(stream) with video.srcObject = stream, as createObjectURL with a stream as argument is being deprecated.

@HortenciaPortes
Copy link

thank you so much help me a lot

@Vuurvlieg
Copy link

@TobiasSeitz @jan-ivar Thank you so much, this will help me a lot!

@Magistern
Copy link

Do you know how to make this work on iOS 11.3?
I know Instagram.com makes it work somehow.

@kimpossible6
Copy link

thanks so much!!

@barcenitas
Copy link

I love you

@TudorGruian
Copy link

Thank you so much.Really apreciate it

@ubonsoft
Copy link

ubonsoft commented Jun 5, 2018

So GOOOOOOD

@regisnew
Copy link

regisnew commented Sep 3, 2018

Show.
Congrants.

@dgloriaweb
Copy link

Sorry guys for me being lame, but where does canvas.toDataURL save the image? Thanks in advance.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment