今天有个需求,需要在前端界面调用本地摄像头,然后拍照结束后可以截取预览,最后将结果提交到后台。查了网上很多的插件,发现适合的非常少,于是决定自己修改一个。

这里我修改了一个jquery插件,把摄像头拍照的功能融合了进去。

提交到后台时是提交一个base64字符,在后台再将base64字符转换为图片保存。

效果图:

支持本地上传,下载完整demo可以直接运行。

demo 的git下载地址:https://github.com/HL-Guitar/photograph

getUserMedia函数是请求用户摄像头的方法,随着浏览器版本的更新可能无法兼容,可以修改这个方法来实现兼容,最新版本火狐,旧版本谷歌没有问题。

完整demo:

<button id="replaceImg" class="l-btn">更换图片</button><!--图片裁剪框 start-->
<div style="display: none" class="tailoring-container"><div class="black-cloth" onclick="closeTailor(this)"></div><div class="tailoring-content"><div class="tailoring-content-one"><label title="上传图片" for="chooseImg" class="l2-btn choose-btn"><input type="file" accept="image/jpg,image/jpeg,image/png" name="file" id="chooseImg" class="hidden" onchange="selectImg(this)">本地上传</label><label title="拍照" class="l2-btn choose-btn" id='capture' style="margin-left: 2%;">拍照</label><label title="重拍" class="l2-btn choose-btn" id='takeAgain' style="margin-left: 2%;">重拍</label><div class="close-tailoring"  onclick="closeTailor(this)">×</div></div><div class="tailoring-content-two"><div class="tailoring-box-parcel"><video id="video" width="100%" height="100%" controls  style="float: left;" ></video><canvas id="canvas" width="482px" height="448px" style="float: left;" hidden="hidden"></canvas><div id="showImg" hidden="hidden" style="width: 100%;height:100%;"><img id="tailoringImg"></div></div><div class="preview-box-parcel"><p>图片预览:</p><div class="square previewImg"></div><div class="circular previewImg"></div></div></div><div class="tailoring-content-three"><button class="l2-btn cropper-reset-btn">复位</button><button class="l2-btn cropper-rotate-btn">旋转</button><button class="l2-btn cropper-scaleX-btn">换向</button><button class="l2-btn sureCut" id="sureCut">确定</button></div></div>
</div>
<!--图片裁剪框 end--><script>//弹出框水平垂直居中(window.onresize = function () {var win_height = $(window).height();var win_width = $(window).width();if (win_width <= 768){$(".tailoring-content").css({"top": (win_height - $(".tailoring-content").outerHeight())/2,"left": 0});}else{$(".tailoring-content").css({"top": (win_height - $(".tailoring-content").outerHeight())/2,"left": (win_width - $(".tailoring-content").outerWidth())/2});}})();//图像上传function selectImg(file) {if (!file.files || !file.files[0]){return;}var reader = new FileReader();reader.onload = function (evt) {var replaceSrc = evt.target.result;//更换cropper的图片$('#tailoringImg').cropper('replace', replaceSrc,false);//默认false,适应高度,不失真}reader.readAsDataURL(file.files[0]);mediaStreamTrack && mediaStreamTrack.stop();$("#video").hide();$("#showImg").show();}//cropper图片裁剪$('#tailoringImg').cropper({aspectRatio: 1/1,//默认比例preview: '.previewImg',//预览视图guides: false,  //裁剪框的虚线(九宫格)autoCropArea: 0.5,  //0-1之间的数值,定义自动剪裁区域的大小,默认0.8movable: false, //是否允许移动图片dragCrop: true,  //是否允许移除当前的剪裁框,并通过拖动来新建一个剪裁框区域movable: true,  //是否允许移动剪裁框resizable: true,  //是否允许改变裁剪框的大小zoomable: false,  //是否允许缩放图片大小mouseWheelZoom: false,  //是否允许通过鼠标滚轮来缩放图片touchDragZoom: true,  //是否允许通过触摸移动来缩放图片rotatable: true,  //是否允许旋转图片crop: function(e) {// 输出结果数据裁剪图像。}});//弹框$("#replaceImg").on("click",function () {takeImg()});//旋转$(".cropper-rotate-btn").on("click",function () {$('#tailoringImg').cropper("rotate", 45);});//复位$(".cropper-reset-btn").on("click",function () {$('#tailoringImg').cropper("reset");});//换向var flagX = true;$(".cropper-scaleX-btn").on("click",function () {if(flagX){$('#tailoringImg').cropper("scaleX", -1);flagX = false;}else{$('#tailoringImg').cropper("scaleX", 1);flagX = true;}flagX != flagX;});//裁剪后的处理$("#sureCut").on("click",function () {var cas = $('#tailoringImg').cropper('getCroppedCanvas');//获取被裁剪后的canvasvar base64url = cas.toDataURL('image/png'); //转换为base64地址形式base64url=base64url.replace("\r","")$.post("../Info", {op:"takePhoto",base64url:base64url }, function(data) {var result=parseInt($.trim(data.result));if(result==-1){$.messager.show({title:"温馨提示",msg:"输入的信息不完整,确认后重新提交。",timeout:3000,showType:'slide'})}else if(result>0){$.messager.show({title:"成功提示",msg:"头像更新成功",timeout:3000,showType:'slide'})//$('#attendance_info').css('color','green').text("已提交");}else{$.messager.alert("失败提示","头像更新失败,请稍后重试...",'error')}}, "JSON");//关闭裁剪框closeTailor();});//关闭裁剪框function closeTailor() {$(".tailoring-container").toggle();mediaStreamTrack && mediaStreamTrack.stop();}//访问用户媒体设备的兼容方法function getUserMedia(constraints, success, error) {if (navigator.mediaDevices.getUserMedia) {//最新的标准APInavigator.mediaDevices.getUserMedia(constraints).then(success).catch(error);} else if (navigator.webkitGetUserMedia) {//webkit核心浏览器navigator.webkitGetUserMedia(constraints,success, error)} else if (navigator.mozGetUserMedia) {//firfox浏览器navigator.mozGetUserMedia(constraints, success, error);} else if (navigator.getUserMedia) {//旧版APInavigator.getUserMedia(constraints, success, error);}}let video = document.getElementById('video');let canvas = document.getElementById('canvas');let context = canvas.getContext('2d');var mediaStreamTrackfunction success(stream) {//兼容webkit核心浏览器let CompatibleURL = window.URL || window.webkitURL;//将视频流设置为video元素的源mediaStreamTrack = stream.getTracks()[0];//video.src = CompatibleURL.createObjectURL(stream);video.srcObject = stream;video.play();}function error(error) {alert('访问用户媒体设备失败,请尝试更换浏览器')}document.getElementById('capture').addEventListener('click', function () {context.drawImage(video, 0, 0, 480, 320);mediaStreamTrack && mediaStreamTrack.stop();$('#tailoringImg').cropper('replace', canvas.toDataURL("image/png"),false);//默认false,适应高度,不失真$("#video").hide();//隐藏拍照框$("#showImg").show()//将拍照结果显示})//请求拍照$("#takeAgain").bind("click", function(){takePhoto();});//开始拍照function takeImg(){$(".tailoring-container").toggle();takePhoto();}//请求摄像头function takePhoto() {if (navigator.mediaDevices.getUserMedia || navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia) {//调用用户媒体设备, 访问摄像头getUserMedia({video : {width: 100, height: 100}}, success, error);$("#showImg").hide();//隐藏拍照结果显示框//$('#showImg').html('<img id="tailoringImg" hidden="hidden">')$("#video").show();//开启拍照框} else {alert('不支持访问用户媒体');}}
</script>

js调用本地摄像头拍照截图,提交后台相关推荐

  1. 摄像头网页服务器,js调用本地摄像头拍照并上传到web服务器

    [实例简介] js调用本地摄像头拍照并上传到web服务器.后台使用java实现图片的接收和存储,上传的图片默认保存到项目下的images文件夹中. [实例截图] [核心代码] MyCamera └── ...

  2. JS调用本地摄像头拍照(兼容各大浏览器及IE8+)

    最近做的项目遇到了个难题,使用video+canvas+getUserMedia()写的调用本地摄像头拍照不兼容IE. 原因:IE8及以下不支持HTML5标签:video和canvas:IE11及以下 ...

  3. html5 调用摄像头 支持IE,JS调用本地摄像头拍照(兼容各大浏览器及IE8+)

    最近做的项目遇到了个难题,使用video+canvas+getUserMedia()写的调用本地摄像头拍照不兼容IE. 原因:IE8及以下不支持HTML5标签:video和canvas:IE11及以下 ...

  4. php调用本地摄像头,javascript 调用本地摄像头拍照 ajax提交上传

    最近在做一个小应用,里面有一个功能就是需要打开摄像头拍照并且上传,今天就记录一下这个小功能. HTML篇: 这里我是用的layui的样式,需要先引用layui的样式,才会有上图的效果. * 照片: 点 ...

  5. 利用python调用本地摄像头拍照,对图片命名并保存到指定位置,带界面

    1.需求: 因项目需要做一个以图搜图的小程序,需要储备零件图库,约1000种 2.原计划&痛点 原本想通过手机挨个拍照,再拷贝出来,重命名,这样会耽误大量时间,且容易出错 3.解决方案 于是做 ...

  6. php h5 调用摄像头_利用html5调用本地摄像头拍照上传图片

    [php]代码库html5概念啥的就不废话了,不知道的 百度, 谷歌一堆..今天学了学html5中的Canvas结合新增的标签来获取本地摄像头,在html5之前,要在浏览器获取本地摄像头只有通过插件( ...

  7. vue+springboot实现调用本地摄像头拍照上传后端使用百度ocr识别身份证信息

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.前端 二.后端 总结 提示:以下是本篇文章正文内容,下面案例可供参考 一.前端 1.首先进入页面打开摄像头 2.点击手动 ...

  8. h5+ 调用本地摄像头拍照

    <html> <div id="form"><div class="name-box"><span>姓名< ...

  9. js调用本地摄像头demo

    效果: html <!DOCTYPE html> <html lang="en"> <head><meta charset="U ...

最新文章

  1. python中文编码-python中文编码json中文输出问题
  2. 【备忘】Oracle10g 创建、删除表空间、创建、授权用户
  3. 中过滤记录中时间_水肥一体化中如何选择过滤器
  4. Leetcode题库 598.N叉树的前序遍历(递归迭代 C实现)
  5. Document Builder: 如何启用rule 分析的trace mode
  6. c php数据,C 数据类型
  7. python上传文件 request_Python request post上传文件常见要点
  8. ubuntu 12.04 mysql_Ubuntu 12.04 mysql 源码安装--mysql.5.5.x
  9. 【Computer Organization笔记10】单周期CPU设计:基于7条MIPS指令的数据通路
  10. 一小时做出Java实战项目——飞翔的小鸟
  11. 【转】PHP缓存的实现
  12. Protel.DXP2004 电路板设计
  13. 常微分方程I ODE的例子3 生态学模型:Malthus增长模型、Lotka-Volterra模型
  14. YIGO标准平台解决模态窗口不能刷新父界面的方法
  15. python高校学生社团管理系统django项目源码介绍
  16. 手把手教你用 jQuery 制作无缝轮播
  17. EMC 电磁兼容测试标准
  18. IDEA2021版本的安装和使用教程
  19. 【RabbitMQ】学习笔记
  20. 前端性能优化总结/懒加载、函数节流、优化dom操作、雪碧图、合并文件

热门文章

  1. git rebase(变基)操作演示
  2. 【Jmeter-脚本录制】
  3. solidity基础学习
  4. 追求境界,毫无“线”制 NINEKA南卡T1真无线蓝牙耳机
  5. python两个等于号是代表什么_python两个等于号是什么意思_等于号表示什么意思...
  6. phpcms api接口开发
  7. #企业要求程序员统一电脑桌面,网友:桌面壁纸都不配拥有?
  8. Spring Boot 2.0 配置图文教程
  9. Statement和PreparedStatement的区别/PreparedStatement和Statement比较的优点
  10. 广工计算机组成原理考试,广工计算机组成原理期末考试B卷(杨卫平)