欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java實(shí)現(xiàn)電腦端掃描二維碼

 更新時(shí)間:2018年10月16日 11:18:45   作者:秋波蓮月  
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)電腦端掃描二維碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了java實(shí)現(xiàn)電腦端掃描二維碼的具體代碼,供大家參考,具體內(nèi)容如下

說明:js調(diào)去電腦攝像頭拍照,然后獲取圖片base64位編碼,再將base64為編碼轉(zhuǎn)為bolb,通過定時(shí)異步上傳到后臺(tái),在后臺(tái)對圖片文件進(jìn)行解碼,返回解碼結(jié)果到頁面,然后頁面重新加載結(jié)果(url)

第一種方式引入js

<script type="text/javascript" src="${basePath}js/jquery-1.9.min.js"></script>
<script type="text/javascript" src="${basePath}js/jquery.webcam.min.js"></script>

第二種方式引入js

<script type="text/javascript" src="${basePath}js/jquery-1.9.min.js"></script>
<!-- 這個(gè)應(yīng)該是需要的 -->
<script type="text/javascript" src="${basePath}js/jquery.qrcode.min.js"></script>

后臺(tái)java代碼maven引入jar包

 <dependency>
   <groupId>com.github.binarywang</groupId>
   <artifactId>qrcode-utils</artifactId>
   <version>1.1</version>
 </dependency>
 
 <dependency>
   <groupId>com.google.zxing</groupId>
   <artifactId>core</artifactId>
   <version>3.3.3</version>
 </dependency>

后臺(tái)代碼處理方式:

public class EwmDescode {
 
 /**
  * 解析二維碼
  * 
  * @param input
  *      二維碼輸入流
  */
 public static final String parse(InputStream input) throws Exception {
   Reader reader = null;
   BufferedImage image;
   try {
     image = ImageIO.read(input);
     if (image == null) {
       throw new Exception("cannot read image from inputstream.");
     }
     final LuminanceSource source = new BufferedImageLuminanceSource(image);
     final BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
     final Map<DecodeHintType, String> hints = new HashMap<DecodeHintType, String>();
     hints.put(DecodeHintType.CHARACTER_SET, "utf-8");
     // 解碼設(shè)置編碼方式為:utf-8,
     reader = new MultiFormatReader();
     return reader.decode(bitmap, hints).getText();
   } catch (IOException e) {
     e.printStackTrace();
     throw new Exception("parse QR code error: ", e);
   } catch (ReaderException e) {
     e.printStackTrace();
     throw new Exception("parse QR code error: ", e);
     }
   }
 
   /**
  * 解析二維碼
  * 
  * @param url
  *      二維碼url
  */
 public static final String parse(URL url) throws Exception {
   InputStream in = null;
   try {
     in = url.openStream();
     return parse(in);
   } catch (IOException e) {
     e.printStackTrace();
     throw new Exception("parse QR code error: ", e);
     } finally {
       IOUtils.closeQuietly(in);
     }
   }
 
   /**
  * 解析二維碼
  * 
  * @param file
  *      二維碼圖片文件
  */
 public static final String parse(File file) throws Exception {
   InputStream in = null;
   try {
     in = new BufferedInputStream(new FileInputStream(file));
     return parse(in);
   } catch (FileNotFoundException e) {
     e.printStackTrace();
     throw new Exception("parse QR code error: ", e);
     } finally {
       IOUtils.closeQuietly(in);
     }
   }
 
   /**
  * 解析二維碼
  * 
  * @param filePath
  *      二維碼圖片文件路徑
  */
 public static final String parse(String filePath) throws Exception {
   InputStream in = null;
   try {
     in = new BufferedInputStream(new FileInputStream(filePath));
     return parse(in);
   } catch (FileNotFoundException e) {
     e.printStackTrace();
     throw new Exception("parse QR code error: ", e);
   } finally {
     IOUtils.closeQuietly(in);
   }
 }
 
}
@RequestMapping("/decodeEwm")
 @ResponseBody
 public String decodeEwm(MultipartFile ewmImg){
 String parse = null;
 try {
  parse = EwmDescode.parse(ewmImg.getInputStream());
 } catch (Exception e) {
  //e.printStackTrace();
 }
 
 String msg = "no";
 if(StringUtils.isNotBlank(parse)){
  return parse;
 }
 return msg;
 }

前臺(tái)jsp代碼:

第一種處理方式:

<%@ page contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
 String path = request.getContextPath();
 String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
  + path + "/resources/";
 String urlPath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
  + path + "/";
 request.setAttribute("path", path);
 request.setAttribute("basePath", basePath);
 request.setAttribute("urlPath", urlPath);
%>
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>webcam</title>
    <style type="text/css">
      #webcam {
        width: auto;
        height: auto;
        float: left;
      }
      #base64image {
        display: block;
        width: 320px;
        height: 240px;
      }
    </style>
 
    <!-- 基本的jquery引用,1.5版本以上 -->
    <script type="text/javascript" src="${basePath}js/jquery-1.9.min.js"></script>
 
    <!-- webcam插件引用 -->
    <script type="text/javascript" src="${basePath}js/jquery.webcam.min.js"></script>
 
  </head>
 
  <body>
 
    <div id="webcam"></div>
    <canvas id="canvas" width="320" height="240" style="display: none;"></canvas>
    <input id="snapBtn" type="button" value="拍照" style="display: none;"/>
    <img id="base64image" src='' />
 
    <script type="text/javascript">
      
      $(document).ready(function() {
       var pos = 0,
         ctx = null,
         image = [];
       var w = 320;
       var h = 240;
 
        jQuery("#webcam").webcam({
 
          width: 320,
          height: 240,
          mode: "callback",
          swffile: "${basePath}js/jscam_canvas_only.swf", // 這里引入swf文件,注意路徑
         // swffile: "/jscam_canvas_only.swf", // 這里引入swf文件,注意路徑
          onTick: function(remain) {},
          onSave: function(data) {
 
            var col = data.split(";");
            var img = image;
 
            for(var i = 0; i < 320; i++) {
              var tmp = parseInt(col[i]);
              img.data[pos + 0] = (tmp >> 16) & 0xff;
              img.data[pos + 1] = (tmp >> 8) & 0xff;
              img.data[pos + 2] = tmp & 0xff;
              img.data[pos + 3] = 0xff;
              pos += 4;
            }
 
            if(pos >= 4 * 320 * 240) {
            
              // 將圖片顯示到canvas中
              ctx.putImageData(img, 0, 0);
              sumitImageFile(canvas.toDataURL("image/png"));
              /* // 取得圖片的base64碼
              var base64 = canvas.toDataURL("image/png");          
              // 將圖片base64碼設(shè)置給img
              var base64image = document.getElementById('base64image');                               
              base64image.setAttribute('src', base64); */
 
              pos = 0;
 
            }
 
          },
 
          onCapture: function() {
            webcam.save();
            // Show a flash for example
          },
 
          debug: function(type, string) {
            console.log('type:' + type + ',string:' + string);
            // Write debug information to console.log() or a div
          },
 
          onLoad: function() {
            // Page load
          }
 
        });
        window.addEventListener("load", function() {
 
          var canvas = document.getElementById("canvas");
 
          if(canvas.getContext) {
            ctx = canvas.getContext("2d");
            ctx.clearRect(0, 0, 320, 240);
 
            var img = new Image();
            img.onload = function() {
              ctx.drawImage(img, 129, 89);
            }
            image = ctx.getImageData(0, 0, 320, 240);
          }
 
        }, false);
  
        $('#snapBtn').on('click', function() {
          webcam.capture();
        });
      });
      
      setInterval(function () {
       $("#snapBtn").click();
      }, 1500); 
      
      /**
       * @param base64Codes
       *      圖片的base64編碼
       */
      function sumitImageFile(base64Codes){
       // var form=document.forms[0];
        
       // var formData = new FormData(form);  //這里連帶form里的其他參數(shù)也一起提交了,如果不需要提交其他參數(shù)可以直接FormData無參數(shù)的構(gòu)造函數(shù)
        var formData = new FormData();  //這里連帶form里的其他參數(shù)也一起提交了,如果不需要提交其他參數(shù)可以直接FormData無參數(shù)的構(gòu)造函數(shù)
        
        //convertBase64UrlToBlob函數(shù)是將base64編碼轉(zhuǎn)換為Blob
        formData.append("ewmImg",convertBase64UrlToBlob(base64Codes)); //append函數(shù)的第一個(gè)參數(shù)是后臺(tái)獲取數(shù)據(jù)的參數(shù)名,和html標(biāo)簽的input的name屬性功能相同
        
        //ajax 提交form
        $.ajax({
          url : '${urlPath}query/decodeEwm',
          type : "POST",
          data : formData,
          dataType:"text",
          processData : false,     // 告訴jQuery不要去處理發(fā)送的數(shù)據(jù)
          contentType : false,    // 告訴jQuery不要去設(shè)置Content-Type請求頭
          
          success:function(data){
           //alert(data);
           if(data != "no"){
            window.location.href=data;
           }
          },
          xhr:function(){      //在jquery函數(shù)中直接使用ajax的XMLHttpRequest對象
            var xhr = new XMLHttpRequest();
            
            xhr.upload.addEventListener("progress", function(evt){
              if (evt.lengthComputable) {
                var percentComplete = Math.round(evt.loaded * 100 / evt.total); 
                console.log("正在提交."+percentComplete.toString() + '%');    //在控制臺(tái)打印上傳進(jìn)度
              }
            }, false);
            
            return xhr;
          }
          
        });
      }
 
      /**
       * 將以base64的圖片url數(shù)據(jù)轉(zhuǎn)換為Blob
       * @param urlData
       *      用url方式表示的base64圖片數(shù)據(jù)
       */
      function convertBase64UrlToBlob(urlData){
        
        var bytes=window.atob(urlData.split(',')[1]);    //去掉url的頭,并轉(zhuǎn)換為byte
        
        //處理異常,將ascii碼小于0的轉(zhuǎn)換為大于0
        var ab = new ArrayBuffer(bytes.length);
        var ia = new Uint8Array(ab);
        for (var i = 0; i < bytes.length; i++) {
          ia[i] = bytes.charCodeAt(i);
        }
 
        return new Blob( [ab] , {type : 'image/png'});
      }
      
    </script>
  </body>
 
</html>

第二種處理方式:

<%@ page contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
 String path = request.getContextPath();
 String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
  + path + "/resources/";
 String urlPath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
  + path + "/";
 request.setAttribute("path", path);
 request.setAttribute("basePath", basePath);
 request.setAttribute("urlPath", urlPath);
%>
<!DOCTYPE html>
<html>
<head>
<title>QRCODE</title>
</head>
<script type="text/javascript" src="${basePath}js/jquery-1.9.min.js"></script>
<!-- 這個(gè)應(yīng)該是需要的 -->
<script type="text/javascript" src="${basePath}js/jquery.qrcode.min.js"></script>
<body>
<style>#video {display: block;margin:1em auto;width:280px;height:280px;}</style> 
<video id="video" autoplay></video>
<script>
  window.addEventListener("DOMContentLoaded", function () {
    var video = document.getElementById("video"), canvas, context;
    try {
      canvas = document.createElement("canvas");
      context = canvas.getContext("2d");
    } catch (e) { alert("not support canvas!"); return; }
    
    navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;
 
    if (navigator.getUserMedia){
      navigator.getUserMedia(
        { "video": true },
        function (stream) {
          if (video.mozSrcObject !== undefined)video.mozSrcObject = stream;
          else video.src = ((window.URL || window.webkitURL || window.mozURL || window.msURL) && window.URL.createObjectURL(stream)) || stream;        
          video.play();
        },
        function (error) {
          if(error.PERMISSION_DENIED){
           alert("用戶拒絕了瀏覽器請求媒體的權(quán)限");
          }
           //console.log("用戶拒絕了瀏覽器請求媒體的權(quán)限",error.code);
          if(error.NOT_SUPPORTED_ERROR){
           alert("當(dāng)前瀏覽器不支持拍照功能");
          }
           //console.log("當(dāng)前瀏覽器不支持拍照功能",error.code);
          if(error.MANDATORY_UNSATISFIED_ERROR){
           alert("指定的媒體類型未接收到媒體流");
          }
           //console.log("指定的媒體類型未接收到媒體流",error.code);
          alert("Video capture error: " + error.code);
        }
      );
     //定時(shí)掃描
      setInterval(function () {
        context.drawImage(video, 0, 0, canvas.width = video.videoWidth, canvas.height = video.videoHeight);
    sumitImageFile(canvas.toDataURL());
      }, 1500);
    } else {
     alert("掃描出錯(cuò),換種方式試試!");
    }
    
 
  }, false);
  
  
  /**
   * @param base64Codes
   *      圖片的base64編碼
   */
  function sumitImageFile(base64Codes){
   // var form=document.forms[0];
    
   // var formData = new FormData(form);  //這里連帶form里的其他參數(shù)也一起提交了,如果不需要提交其他參數(shù)可以直接FormData無參數(shù)的構(gòu)造函數(shù)
    var formData = new FormData();  //這里連帶form里的其他參數(shù)也一起提交了,如果不需要提交其他參數(shù)可以直接FormData無參數(shù)的構(gòu)造函數(shù)
    
    //convertBase64UrlToBlob函數(shù)是將base64編碼轉(zhuǎn)換為Blob
    formData.append("ewmImg",convertBase64UrlToBlob(base64Codes)); //append函數(shù)的第一個(gè)參數(shù)是后臺(tái)獲取數(shù)據(jù)的參數(shù)名,和html標(biāo)簽的input的name屬性功能相同
    
    //ajax 提交form
    $.ajax({
      url : '${urlPath}query/decodeEwm',
      type : "POST",
      data : formData,
      dataType:"text",
      processData : false,     // 告訴jQuery不要去處理發(fā)送的數(shù)據(jù)
      contentType : false,    // 告訴jQuery不要去設(shè)置Content-Type請求頭
      
      success:function(data){
       //alert(data);
       if(data != "no"){
        window.location.href=data;
       }
      },
      xhr:function(){      //在jquery函數(shù)中直接使用ajax的XMLHttpRequest對象
        var xhr = new XMLHttpRequest();
        
        xhr.upload.addEventListener("progress", function(evt){
          if (evt.lengthComputable) {
            var percentComplete = Math.round(evt.loaded * 100 / evt.total); 
            console.log("正在提交."+percentComplete.toString() + '%');    //在控制臺(tái)打印上傳進(jìn)度
          }
        }, false);
        
        return xhr;
      }
      
    });
  }
 
  /**
   * 將以base64的圖片url數(shù)據(jù)轉(zhuǎn)換為Blob
   * @param urlData
   *      用url方式表示的base64圖片數(shù)據(jù)
   */
  function convertBase64UrlToBlob(urlData){
    
    var bytes=window.atob(urlData.split(',')[1]);    //去掉url的頭,并轉(zhuǎn)換為byte
    
    //處理異常,將ascii碼小于0的轉(zhuǎn)換為大于0
    var ab = new ArrayBuffer(bytes.length);
    var ia = new Uint8Array(ab);
    for (var i = 0; i < bytes.length; i++) {
      ia[i] = bytes.charCodeAt(i);
    }
 
    return new Blob( [ab] , {type : 'image/png'});
  }
  
 </script> 
 
</body>
 
</html>

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。 

相關(guān)文章

  • Java連接Oracle數(shù)據(jù)庫并查詢

    Java連接Oracle數(shù)據(jù)庫并查詢

    這篇文章主要介紹了Java連接Oracle數(shù)據(jù)庫并查詢的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • 淺談SpringBoot如何自定義Starters

    淺談SpringBoot如何自定義Starters

    今天帶大家來學(xué)習(xí)SpringBoot如何自定義Starters,文中有非常詳細(xì)的圖文介紹及代碼示例,對正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • java圖形界面編程之模擬血壓計(jì)

    java圖形界面編程之模擬血壓計(jì)

    本文主要介紹了java基于圖形處理的模擬血壓計(jì),創(chuàng)新實(shí)驗(yàn)項(xiàng)目的部分代碼,作為平時(shí)練習(xí)用。
    2014-02-02
  • MyBatis如何調(diào)用存儲(chǔ)過程與存儲(chǔ)函數(shù)

    MyBatis如何調(diào)用存儲(chǔ)過程與存儲(chǔ)函數(shù)

    這篇文章主要介紹了MyBatis如何調(diào)用存儲(chǔ)過程與存儲(chǔ)函數(shù),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 正確結(jié)束Java線程的方法

    正確結(jié)束Java線程的方法

    線程的啟動(dòng)很簡單,但用戶可能隨時(shí)取消任務(wù),怎么樣讓跑起來的線程正確地結(jié)束,這是今天要討論的話題。下面小編來和大家一起學(xué)習(xí)一下吧
    2019-05-05
  • springboot接入微信app支付的方法

    springboot接入微信app支付的方法

    本文使用springboot集成微信支付服務(wù),包含微信統(tǒng)一支付訂單接口,以及支付回調(diào)接口等,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 5分鐘讓你快速掌握java8 stream常用開發(fā)技巧

    5分鐘讓你快速掌握java8 stream常用開發(fā)技巧

    這篇文章主要給大家介紹了關(guān)于java8 stream常用開發(fā)技巧的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • springboot中.yml文件的值無法讀取的問題及解決

    springboot中.yml文件的值無法讀取的問題及解決

    這篇文章主要介紹了springboot中.yml文件的值無法讀取的問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • JAVA中split函數(shù)的常見用法實(shí)例

    JAVA中split函數(shù)的常見用法實(shí)例

    Java中我們可以利用split把字符串按照指定的分割符進(jìn)行分割,然后返回字符串?dāng)?shù)組,下面這篇文章主要給大家介紹了關(guān)于JAVA中split函數(shù)的常見用法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • 使用spring aop 統(tǒng)一捕獲異常和寫日志的示例demo

    使用spring aop 統(tǒng)一捕獲異常和寫日志的示例demo

    本文通過一個(gè)小demo給大家介紹spring AOP 實(shí)現(xiàn)的異常捕獲和日志的方法技巧,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-08-08

最新評論