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

 

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

先看看效果。。。(个人测试:使用谷歌Chrome 23.0.1271.97)

看看主要代码吧:

这个是前台HTML的代码。

1
2
3
4
5
<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)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<script>   
   //判断浏览器是否支持HTML5 Canvas   
       window.onload = function () {   
           try {   
               //动态创建一个canvas元素,并获取他2Dcontext。如果出现异常则表示不支持   
               document.createElement("canvas").getContext("2d");   
               document.getElementById("support").innerHTML = "浏览器支持HTML5 CANVAS";   
           }   
           catch (e) {   
               document.getElementById("support").innerHTML = "浏览器不支持HTML5 CANVAS";   
           }   
          
       };   
          
       //这段代码主要是获取摄像头的视频流并显示在Video标签中   
       window.addEventListener("DOMContentLoaded"function () {   
           var canvas = document.getElementById("canvas"),   
               context = canvas.getContext("2d"),   
               video = document.getElementById("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.getElementById("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编码之后的图像文件了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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了...

利用html5调用本地摄像头拍照上传图片[转]的更多相关文章

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

    这个是前台HTML的代码. <div id="contentHolder"> <video id="video" width="32 ...

  2. 怎样让HTML5调用手机摄像头拍照——实践就是一切

    原文:怎样让HTML5调用手机摄像头拍照--实践就是一切 NanShan 小编将思路提供给了大家.学编程最重要的是实践,我这尽管有完好的代码,可是希望大家都能够自己写出属于自己的代码 HTML5 Th ...

  3. 调用本地摄像头拍照(H5和画布)

    关于H5 和 画布 调用本地摄像头拍照功能的实现 1.代码的实现(html部分) <input type="button" title="开启摄像头" v ...

  4. HTML5调用本地摄像头画面,拍照,上传服务器

    实现功能和适用业务 采集本地摄像头获取摄像头画面,拍照保存,上传服务器: 前端上传图片处理,展示,缩小,裁剪,上传服务器 实现步骤 调取本地摄像头(getUserMedia)/上传图片,将图片/视频显 ...

  5. getUserMedia API及HTML5 调用手机摄像头拍照

    getUserMedia API简介 HTML5的getUserMedia API为用户提供访问硬件设备媒体(摄像头.视频.音频.地理位置等)的接口,基于该接口,开发者可以在不依赖任何浏览器插件的条件 ...

  6. html5调用手机摄像头,实现拍照上传功能

    今天做手机网站,想实现手机扫描二维码功能.首先实现在浏览器中调用手机摄像头,实现拍照功能并且把拍下的照片显示在页面并上传到服务器上,然后再在服务器端进行分析. 首先实现在浏览器中调用摄像头,当然用现在 ...

  7. H5混合开发二维码扫描以及调用本地摄像头

    今天主管给了我个需求,说要用混合开发,用H5调用本地摄像头进行扫描二维码,我之前有做过原生安卓的二维码扫一扫,主要是通过调用zxing插件进行操作的,其中还弄了个闪光灯.但是纯H5的没接触过,心里没底 ...

  8. HTML5调用手机摄像头,仅仅支持OPPOHD浏览器

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 调用本地摄像头并通过canvas拍照

    首先我们需要新建一个video标签,并且放到html里边 var video = document.createElement("video"); video.autoplay=& ...

随机推荐

  1. Vue 2.0学习(三)指令与事件

    指令(Directives)是Vue.js模板中最常用的一项功能,它带有前缀v-,前面已经使用过v-html.v-pre等.指令的主要职责就是当表达式的值改变时,相应地将某些行为应用到DOM上. v- ...

  2. Hibernate 单项多对一的关联映射

    在日常开发中会出现很对多对一的情况,本文介绍hibernate中多对一的关联映射. 1.设计表结构 2.创建student对象 3.创建Grade对象 4.写hbm.xml文件 5.生成数据库表 生成 ...

  3. WebLogic Server

    前几天,看了几集J2ee , 给我的感觉就是,看不懂!! 一点也不懂! 那怎么办呢? 听老师的,不管懂不懂,先看看再说.接下来,就开始了J2ee "艰苦"的历程.在J2ee中,经常 ...

  4. 【最小路径覆盖】BZOJ2150-部落战争

    [题目大意] 给出一张图,'*'表示不能走的障碍.已知每只军队可以按照r*c的方向行军,且军队与军队之间路径不能交叉.问占据全部'.'最少要多少支军队? [思路] 首先注意题意中有说“军队只能往下走” ...

  5. Educational Codeforces Round 12 D. Simple Subset 最大团

    D. Simple Subset 题目连接: http://www.codeforces.com/contest/665/problem/D Description A tuple of positi ...

  6. Linux6.9用RPM方式安装MySQL5.7.21

    1.下载安装包 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.21-1.el6.x86_64.rpm-bundle.tar ...

  7. VMware中网络设置之host-only

    有了前面一篇的NAT的网络设置,本文就显得非常简单了.同样图文结合的步骤: 1.设置host-only模式. 2.设置linux虚拟机的静态IP.进入linux系统,点击主菜单---系统设置---网络 ...

  8. js中常用日期时间转换

    常用日期时间处理插件:1. timeago.js处理几分钟之前    2. day.js    3. moment.js 注意: 1. 此处的标准时间格式为  2018-03-23 13:35:47 ...

  9. Java:volatile 关键字的一点理解

    背景 学了六年C#,一直没有使用过 volatile,对多线程编程也是偶尔才会使用,这次学习 Java 又遇到了 volatile,准备稍微深入的了解一下. volatile 的作用? 几乎所有支持这 ...

  10. 【Linux编程】进程标识符与fork函数

    ID为0的进程一般是调度进程.常被称为交换进程(swapper),是内核中的系统进程. ID为1的进程叫做init进程,是一个普通用户进程,不属于内核,由内核调用. 一个现有进程能够调用fork函数创 ...