PC端获取摄像头图片并上传的实现

说明:(1)在页面上显示摄像头录像。

            (2)将摄像头的某个帧截屏到img里(实际是base64的图像编码)

            (3)调用jquery上传图片(非文件上传的模式)

             (4)使用Spring MVC 解析并保存图片。

这个功能主要参考了下面两个链接(一个是截屏,一个是上传):

下面是html代码(注意需要将页面放在tomcat里运行,直接在系统里打开是不行的)

 https://www.cnblogs.com/jiangcheng-langzi/p/8391497.html
https://www.cnblogs.com/MrSong97/p/9523666.html

<html>
<head>
<head>
<title> 打开摄像头并截取照片须本地tomcat下运行</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <script src="js/jquery.1.7.2.min.js" type="text/javascript" charset="utf-8"></script>
<script language="javascript">

//将dataUrl转换为blob准备上传
function b64toBlob(b64Data, contentType='', sliceSize=512) {
        const byteCharacters = atob(b64Data);
        const byteArrays = [];

        for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
            const slice = byteCharacters.slice(offset, offset + sliceSize);

            const byteNumbers = new Array(slice.length);
            for (let i = 0; i < slice.length; i++) {
                byteNumbers[i] = slice.charCodeAt(i);
            }

            const byteArray = new Uint8Array(byteNumbers);

            byteArrays.push(byteArray);
        }

      const blob = new Blob(byteArrays, {type: contentType});
      return blob;
}

window.onload = function () {
           var canvas = document.getElementsByTagName('canvas')[0],
               context = canvas.getContext('2d'),
               video = document.getElementsByTagName("video")[0],
               snap = document.getElementById("snap"),
                 close = document.getElementById("close"),
               start = document.getElementById("start"),
               MediaStreamTrack;
           start.addEventListener('click', function () {
               if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
                   navigator.mediaDevices.getUserMedia({
                       video: true,
                       audio: true
                   }).then(function (stream) {
                       console.log(stream);
                       MediaStreamTrack=typeof stream.stop==='function'?stream:stream.getTracks()[1];
                       video.src=(window.URL).createObjectURL(stream);
                       video.play();
                   }).catch(function(err){
                       console.log(err);
                   });
               }else if(navigator.getMedia){
                   navigator.getMedia({
                       video: true
                   }).then(function (stream) {
                       console.log(stream);
                       MediaStreamTrack=stream.getTracks()[1];
                       video.src=(window.webkitURL).createObjectURL(stream);
                       video.play();
                   }).catch(function(err){
                       console.log(err);
                   });
               }
           });
           snap.addEventListener('click', function () {
               context.drawImage(video, 0, 0,200,150);
               //console.log(canvas.toDataURL()); //也可以指定图像格式: var strDataURI = oCanvas.toDataURL("image/jpeg");   得到是base64图像流 
              //将图像显示到img元素:
              //下面将图片显示到图像组件
              var dataurl =  canvas.toDataURL("image/jpeg");
                document.getElementById("demo").src= dataurl;//
          

              
           });

      

           close.addEventListener('click', function () {
               MediaStreamTrack && MediaStreamTrack.stop();
           });
       }


        function upload()
        {
            var ImageURL = document.getElementById("demo").src;
            //var ImageURL2 = document.getElementById("demo2").src;
 
            var block = ImageURL.split(";");
       

            // Get the content type of the image
            const contentType = block[0].split(":")[1];// In this case "image/jpeg"

            // get the real base64 content of the file
            
            const realData = block[1].split(",")[1];//
       

            // Convert it to a blob to upload
            var blob = b64toBlob(realData, contentType);
         

            // new a formData
            
            const formData = new FormData();
         
             formData.append('blob',blob);
            
            //formData.append('blob1', blob);//模拟在增加第二个,一次传2张
            // upload
             $.ajax({
                url:"/portal/rest/ucenterapi/testuploadvideo",
                data: formData,
                type:"POST",
                contentType:false,
                processData:false,
                error:function(err){
                },
                success:function(data){
                alert('hi');
                }
            });

 
        
        }
 
       </script>
       </head>
<body>

<video width="200px" height="150px"></video>
  <canvas width="200px" height="150px"></canvas>
  <p>
      <button id="start">打开摄像头</button>
      <button id="snap">截取身份证正面</button>
      <!--<button id="snap2">截取身份证背面</button>-->
      
      <button id="close">关闭摄像头</button>

      <button id="uploadFile" οnclick="upload()">上传身份证</button>
     

       
  </p>
  <p>
  <img id="demo" src=""/>
  <img id="demo2" src=""/>


</body>
</html>

下面是spring MVC接口代码:

@RequestMapping(value="/testuploadvideo",method={RequestMethod.POST,RequestMethod.GET}) //,RequestMethod.GET
      public @ResponseBody Object  testuploadvideo
      (
           HttpServletRequest request, HttpServletResponse response) throws Exception 
      {
        
        logger.info("调用视频截图::::");
        
        

        
        //https://blog.csdn.net/niuch1029291561/article/details/17377903
        
        // 图片新名字
        HashMap<String,Object>  map = new HashMap();
    
          //遍历头部检查accessToken
            Enumeration<?> enum1 = request.getHeaderNames();
          //检查头部信息
          while (enum1.hasMoreElements()) 
          {
               String key = (String) enum1.nextElement();
               String value = request.getHeader(key);
               System.out.println(key + "\t" + value);
          }
          //遍历传入参数
          Enumeration em = request.getParameterNames();
          while (em.hasMoreElements()) 
          {
              String name1 = (String) em.nextElement();
              String value = request.getParameter(name1);
              logger.info(name1+"/"+value);
              
          }
           
          //logger.info("上传身份证照照片");
        //应该检查access_token如果access_token超时则不允许上传,防止传入过多的垃圾图片。

        CommonsMultipartResolver multipartResolver=new CommonsMultipartResolver(
                request.getSession().getServletContext());
        //检查form中是否有enctype="multipart/form-data"
        if(multipartResolver.isMultipart(request))
        {
             
            //将request变成多部分request
            MultipartHttpServletRequest multiRequest=(MultipartHttpServletRequest)request;
           //获取multiRequest 中所有的文件名
            Iterator iter=multiRequest.getFileNames();
             int i=0;
            while(iter.hasNext()) //暂时先处理一个
            {
                i++;
                logger.info("第"+String.valueOf(i)+"个文件!");
                //一次遍历所有文件
             
                MultipartFile picFile=multiRequest.getFile(iter.next().toString());
                if(picFile!=null)
                {
                     
                    //String path="E:/springUpload"+file.getOriginalFilename();
                    //上传
                  //  file.transferTo(new File(path));
                    
                    String name = StringUtil.getUUID();
                    String oldName = "aaaaaaa.jpg";//picFile.getOriginalFilename();
                    String dt = StringUtil.getCurrentDateTime();
                    String fullPath = request.getRealPath("/")+"upload/"+dt.substring(0,4)+"/"+dt.substring(5,7)+"/"+dt.substring(8,10)+"/";
                    File file = new File(fullPath);
                     
                    if(!fullPath.endsWith("/"))fullPath+="/";
                    file.mkdirs();
                    // 后缀名
                    String exeName = oldName.substring(oldName.lastIndexOf("."));
                     File pic = new File(fullPath + name + exeName);
                     logger.info("上传文件地址:");
                     logger.info(fullPath + name + exeName);
                     String path1 = "/portal"+"/upload/"+dt.substring(0,4)+"/"+dt.substring(5,7)+"/"+dt.substring(8,10)+"/"+name + exeName;
                     
                     logger.info(path1);
                    // 保存图片到本地磁盘
                    picFile.transferTo(pic);
                    //Map map = new HashMap();
                    map.put("url", path1);
                    map.put("rowId", name);

                    map.put("code", 0);
                      map.put("msg", "上传头像成功!");
                      return  map;
                    
                }
                 
            }
           
        }

   
          return map;
      
         
 
    }

下面是页面效果:

HTML是一种标记语言,通常用于构建网页和应用程序的用户界面。尽管HTML不直接支持调用PC摄像头拍照,但可以使用JavaScript和浏览器的媒体设备API来实现此功能。 首先,我们需要在HTML中创建一个包含摄像头视图的元素,比如 `<video>` 标签。然后,我们使用JavaScript来获取用户的媒体设备并将其作为视频流显示在这个 `<video>` 元素中。 ```html <!DOCTYPE html> <html> <head> <title>摄像头拍照</title> </head> <body> <video id="videoElement"></video> <button id="captureButton">拍照</button> <script> // 获取 video 元素 const video = document.getElementById('videoElement'); // 获取媒体设备的权限 if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) { navigator.mediaDevices.getUserMedia({ video: true }) .then(function(stream) { // 将视频流设置为 video 元素的 source video.srcObject = stream; video.play(); }) .catch(function(error) { console.error('获取媒体设备失败: ', error); }); } // 拍照功能 const captureButton = document.getElementById('captureButton'); captureButton.addEventListener('click', function() { // 创建一个 canvas 元素 const canvas = document.createElement('canvas'); canvas.width = video.videoWidth; canvas.height = video.videoHeight; // 在 canvas 上绘制视频当前帧 const context = canvas.getContext('2d'); context.drawImage(video, 0, 0, canvas.width, canvas.height); // 获取图像数据,并将其转换为 base64 编码的字符串 const imageData = canvas.toDataURL('image/jpeg'); // 在控制台中打印图像数据,这里可以根据实际需求将图像数据上传至服务器或进行其他操作 console.log(imageData); }); </script> </body> </html> ``` 通过上述代码,用户可以在网页中看到摄像头的实时画面,并且点击 "拍照" 按钮时,当前画面会被捕捉下来,并在控制台中以 base64 编码的字符串形式打印出来。这样,我们就通过HTML和JavaScript成功地调用了PC摄像头进行拍照。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值