Created
February 17, 2012 09:12
-
-
Save anantn/1852070 to your computer and use it in GitHub Desktop.
Take a picture with getUserMedia
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<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> |
I ran into some problems when I tried this gist on Chrome > v55:
- The
navigator.getUserMedia()
method is deprecated in favor ofnavigator.mediaDevices.getUserMedia()
(https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia, no more prefixes!). - 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);
- 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>
@TobiasSeitz Please replace video.src = window.URL.createObjectURL(stream)
with video.srcObject = stream
, as createObjectURL with a stream as argument is being deprecated.
thank you so much help me a lot
@TobiasSeitz @jan-ivar Thank you so much, this will help me a lot!
Do you know how to make this work on iOS 11.3?
I know Instagram.com makes it work somehow.
thanks so much!!
I love you
Thank you so much.Really apreciate it
So GOOOOOOD
Show.
Congrants.
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
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.