JS打开摄像头并截图上传示例

前端之家收集整理的这篇文章主要介绍了JS打开摄像头并截图上传示例前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

直入正题,JS打开摄像头并截图上传至后端的一个完整步骤

1. 打开摄像头主要用到getUserMedia方法,然后将获取到的媒体流置入video标签

2. 截取图片主要用到canvas绘图,使用drawImage方法将video的内容绘至canvas中

3. 将截取内容上传至服务器,将canvas中的内容转为base64格式上传,后端(PHP)通过file_put_contents将其转为图片

要注意的是,在chrome以外的浏览器中,使用摄像头或多或少会出现一些问题,可能也是老问题了,所以以下代码主要基于chrome使用

比如在最新版FireFox中的报错,不知为啥

1. 打开摄像头

getUserMedia 有新版本和旧版本两种,建议使用新版本

旧版本位于navigator 对象下,根据浏览器不同有所不同

获取媒体方法(旧方法) navigator.getMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMeddia || navigator.msGetUserMedia;
video.src = (window.URL || window.webkitURL).createObjectURL(stream); video.play(); },function(err) { console.log(err); });

}

第一个参数中指示需要使用视频(video)或音频(audio)。

第二个参数中指示调用成功后的回调,其中带一个参数(MediaStream),在旧版本中可以直接通过调用MediaStream.stop() 来关闭摄像头,不过在新版之中已废弃。需要使用MediaStream.getTracks()[index].stop() 来关闭相应的Track

第三个参数指示调用失败后的回调

新版本位于navigator.mediaDevices 对象下

dio: true }).then(function(stream) { console.log(stream);
  mediaStreamTrack = typeof stream.stop === 'function' ? stream : stream.getTracks()[1];

  video.src = (window.URL || window.webkitURL).createObjectURL(stream);
  video.play();
}).catch(function(err) {
  console.log(err);
})

}

与旧版类似,不过该方法返回了一个Promise对象,可以使用then和catch表示成功与失败的回调

需要注意的是,MediaStream.getTracks() 返回的Tracks数组是按第一个参数倒序排列的

比如现在定义了

dio: true }

关闭摄像头,就需要调用MediaStream.getTracks()[1].stop();

同理,0对应于audio的track

使用createObjectURL 将MediaStream写入video标签,就能够存储实时的媒体流数据(也可以方便的实时查看画面)

旧版本中webkitURL 对象以不被支持,需要使用URL对象

2. 截取图像

内容写入即可

截取图像 snap.addEventListener('click',function() { context.drawImage(video,200,150); },false);

3. 关闭摄像头

关闭摄像头 close.addEventListener('click',function() { mediaStreamTrack && mediaStreamTrack.stop(); },false);

4. 上传截取的图像

canvas.toDataURL('image/png')

上传截取的图像 upload.addEventListener('click',function() { jQuery.post('/uploadSnap.PHP',{ snapData: canvas.toDataURL('image/png') }).done(function(rs) { rs = JSON.parse(rs);
  console.log(rs);

  uploaded.src = rs.path;
}).fail(function(err) {
  console.log(err);
});

},false);

而这里的后端(PHP)则将获取内容转换成图像文件保存

需要注意的是,要将base64的头部信息字段去掉再保存,否则似乎图像是损坏无法打开滴

PHP;"> $snapData = $_POST['snapData'];
$snapData = str_replace('data:image/png;base64,','',$snapData);
// $snapData = str_replace(' ','+',$snapData);

$img = base64_decode($snapData);

$uploadDir = 'upload/';
$fileName = date('YmdHis',time()) . uniqid();

if (!(file_put_contents($uploadDir . $fileName,$img))) {
echo json_encode(array('code' => 500,'msg' => '文件上传失败'));
} else {
echo json_encode(array('code' => 200,'msg' => '文件上传成功','path' => $uploadDir . $fileName));
}

?>

完整JS代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。

猜你在找的JavaScript相关文章