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

看看主要代码吧:

这个是前台HTML的代码。

1.  <div id="contentHolder">       
2.  <video id="video" width="320" height="320" autoplay>
3.  </video>       
4.  <button id="snap" style="display:none"> 拍照</button>        
5.  <canvas style="display:none" id="canvas" width="320" height="320">
6.  </canvas> 
7.     </div>

复制代码

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

1.  <script>     
2.    //判断浏览器是否支持HTML5 Canvas           
3.  window.onload = function () {          
4.       try {                   
5.  //动态创建一个canvas元 ,并获取他2Dcontext。如果出现异常则表示不支持                   document.createElement("canvas").getContext("2d");        
6.             document.getElementByIdx("support").innerHTML = "浏览器支持HTML5 CANVAS";         
7.        }          
8.       catch (e) {           
9.          document.getElementByIdx("support").innerHTML = "浏览器不支持HTML5 CANVAS";       
10.          }                
11.       };                
12.       //这段代 主要是获取摄像头的视频流并显示在Video 签中           
13.  window.addEventListener("DOMContentLoaded", function () {            
14.     var canvas = document.getElementByIdx("canvas"),              
15.       context = canvas.getContext("2d"),                
16.     video = document.getElementByIdx("video"),          
17.           videoObj = { "video": true },             
18.        errBack = function (error) {           
19.              console.log("Video capture error: ", error.code);    
20.                 };               
21.      //navigator.getUserMedia这个写法在Opera中好像是navigator.getUserMedianow       
22.          if (navigator.getUserMedia) {     
23.                navigator.getUserMedia(videoObj, function (stream) {
24.                         video.src = stream;                
25.         video.play();      
26.               }, errBack);           
27.      } else if (navigator.webkitGetUserMedia) {        
28.             navigator.webkitGetUserMedia(videoObj, function (stream) {          
29.               video.src = window.webkitURL.createObjectURL(stream);           
30.              video.play();           
31.          }, errBack);           
32.      }         
33.        //这个是拍照按钮的事件,          
34.       $("#snap").click(function () {          
35.           context.drawImage(video, 0, 0, 320, 320);     
36.                //CatchCode();           
37.      });           
38.            }, false);           
39.            //定时器         
40.    var interval = setInterval(CatchCode, "300");      
41.                           //这个是 刷新上 图像的        
42.     function CatchCode() {        
43.         $("#snap").click();
44.  //实际运用可不写,测试代 , 为单击拍照按钮就获取了当前图像,有其他用途    
45.             var canvans = document.getElementByIdx("canvas"); 
46.  //获取浏览器页面的画布对象                       
47.     //以下开始编 数据   
48.                                    var imgData = canvans.toDataURL(); 
49.  //将图像转换为base64数据
50.                 var base64Data = imgData.substr(22); 
51.  //在前端截取22位之后的字符串作为图像数据       
52.                              //开始异步上             
53.     $.post("uploadImgCode.ashx", { "img": base64Data }, function (data, status) {      
54.               if (status == "success") {                 
55.        if (data == "OK") {                
56.             alert("二维 已经解析");                   
57.      }                    
58.     else {              
59.               // alert(data);          
60.               }          
61.           }     
62.                else {   
63.                      alert("数据上 失败");                 
64.    }               }, "text");           
65.            }      
66.  </script>


复制代码


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

    1.  public void ProcessRequest (HttpContext context) {    
    2.        string img;//接收经过base64编 之后的字符串    
    3.        context.Response.ContentType = "text/plain";        
    4.    try       {           
    5.     img =context.Request["img"].ToString();
    6.  //获取base64字符串          
    7.      byte[] imgBytes = Convert.FromBase64String(img);
    8.  //将base64字符串转换为字节数组            
    9.    System.IO.Stream stream = new System.IO.MemoryStream(imgBytes);
    10.  //将字节数组转换为字节流      
    11.          //将流转回Image,用于将PNG 式照片转为jpg,压缩体积以便保存。         
    12.       System.Drawing.Image imgae = System.Drawing.Image.FromStream(stream);    
    13.            imgae.Save(context.Server.MapPath("~/Test/") + Guid.NewGuid().ToString()+".jpg", System.Drawing.Imaging.ImageFormat.Jpeg);//保存图片             
    14.  context.Response.Write("OK");//输出调用结果                
    15.     }          catch (Exception msg)          {             
    16.  img = null;            
    17.    context.Response.Write(msg);      
    18.          return;               
    19.      }              
    20.       }

    复制代码

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