您的位置:首页 > Web前端 > HTML5

利用html5调用本地摄像头拍照上传图片

2017-03-23 13:40 591 查看
html5概念啥的就不废话了,不知道的
百度, 谷歌一堆。。今天学了学html5中的Canvas结合新增的<video>标签来获取本地摄像头,在html5之前,要在浏览器获取本地摄像头只有通过插件(ActiveX,但是这种只有IE支持)或者是flash来获取(或许你没学过flash那就很坑爹了),在之后微软的silvertlight中也可以获取,但这些都比较麻烦,在html5的世界里,要获取本地摄像头,只要配合js就可以轻松获取。。

目前支持html5的浏览器(参考http://www.cnblogs.com/jerry_cong/archive/2011/05/15/2047143.html

看看主要代码吧:

这个是前台HTML的代码。

<div id="contentHolder">       

<video id="video" width="320" height="320" autoplay>

</video>       

<button id="snap" style="display:none"> 拍照</button>        

<canvas style="display:none" id="canvas" width="320" height="320">

</canvas> 

   </div>

复制代码

下面这个是主要代码了。(jquery)

<script>     

  //判断浏览器是否支持HTML5 Canvas           

window.onload = function () {          

     try {                   

//动态创建一个canvas元 ,并获取他2Dcontext。如果出现异常则表示不支持                   document.createElement("canvas").getContext("2d");        

           document.getElementByIdx("support").innerHTML = "浏览器支持HTML5 CANVAS";         

      }          

     catch (e) {           

        document.getElementByIdx("support").innerHTML = "浏览器不支持HTML5 CANVAS";       

        }                

     };                

     //这段代 主要是获取摄像头的视频流并显示在Video 签中           

window.addEventListener("DOMContentLoaded", function () {            

   var canvas = document.getElementByIdx("canvas"),              

     context = canvas.getContext("2d"),                

   video = document.getElementByIdx("video"),          

         videoObj = { "video": true },             

      errBack = function (error) {           

            console.log("Video capture error: ", error.code);    

               };               

    //navigator.getUserMedia这个写法在Opera中好像是navigator.getUserMedianow       

        if (navigator.getUserMedia) {     

              navigator.getUserMedia(videoObj, function (stream) {

                       video.src = stream;                

       video.play();      

             }, errBack);           

    } else if (navigator.webkitGetUserMedia) {        

           navigator.webkitGetUserMedia(videoObj, function (stream) {          

             video.src = window.webkitURL.createObjectURL(stream);           

            video.play();           

        }, errBack);           

    }         

      //这个是拍照按钮的事件,          

     $("#snap").click(function () {          

         context.drawImage(video, 0, 0, 320, 320);     

              //CatchCode();           

    });           

          }, false);           

          //定时器         

  var interval = setInterval(CatchCode, "300");      

                         //这个是 刷新上 图像的        

   function CatchCode() {        

       $("#snap").click();

//实际运用可不写,测试代 , 为单击拍照按钮就获取了当前图像,有其他用途    

           var canvans = document.getElementByIdx("canvas"); 

//获取浏览器页面的画布对象                       

   //以下开始编 数据   

                                  var imgData = canvans.toDataURL(); 

//将图像转换为base64数据

               var base64Data = imgData.substr(22); 

//在前端截取22位之后的字符串作为图像数据       

                            //开始异步上             

   $.post("uploadImgCode.ashx", { "img": base64Data }, function (data, status) {      

             if (status == "success") {                 

      if (data == "OK") {                

           alert("二维 已经解析");                   

    }                    

   else {              

             // alert(data);          

             }          

         }     

              else {   

                    alert("数据上 失败");                 

  }               }, "text");           

          }      

</script>

复制代码

最后的就是接收经过base64编码之后的图像文件了。 

public void ProcessRequest (HttpContext context) {    

      string img;//接收经过base64编 之后的字符串    

      context.Response.ContentType = "text/plain";        

  try       {           

   img =context.Request["img"].ToString();

//获取base64字符串          

    byte[] imgBytes = Convert.FromBase64String(img);

//将base64字符串转换为字节数组            

  System.IO.Stream stream = new System.IO.MemoryStream(imgBytes);

//将字节数组转换为字节流      

        //将流转回Image,用于将PNG 式照片转为jpg,压缩体积以便保存。         

     System.Drawing.Image imgae = System.Drawing.Image.FromStream(stream);    

          imgae.Save(context.Server.MapPath("~/Test/") + Guid.NewGuid().ToString()+".jpg", System.Drawing.Imaging.ImageFormat.Jpeg);//保存图片             

context.Response.Write("OK");//输出调用结果                

   }          catch (Exception msg)          {             

img = null;            

  context.Response.Write(msg);      

        return;               

    }              

     }

复制代码

至此B/S通过本地摄像头拍照上传就完成了。HTML5的强大之处,爱不释手了。。。不在像以前需要写一堆烦人的东东了,而且你也可以不用去学flash...
额外说一句,如果您还在用IE6\IE7那您还是别玩html5了...

初出茅庐,欢迎指教!!

原文:http://blog.sina.com.cn/s/blog_75ad9c560101cu3t.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: