4.H5 名片识别功能

功能描述:

点击名片识别按钮,将名片上的个人信息扫描并解析出来显示。

实现步骤:

1.点击第一个页面上的名片识别按钮,调出手机摄像头和相册,让用户进行选择

2.获取照片或者图片的base64数据,传值到第二个页面

3.在第二个页面接受参数,调取第三方的ocr接口进行图片解析,得到名片上的个人信息,并显示。

------------------------代码--------------------------

第一个页面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style type="text/css">
        html {
            font-size: 62.5%;
            /*10 ÷ 16 × 100% = 62.5%*/
        }
        #btn,
        #input_file {
            font-size: 4.0rem;
            /*2.4*10px=24px*/
        }
        #input_file {
            position: absolute;
            /*相对于最近的祖先元素定位,如果absolute的元素,没有被positioned的祖先元素,那么他是相对于文档的body元素来定位的;一个“positioned”元素是指 position 值不是 static 的元素*/
            left: 8px;
            opacity: 0;
            z-index: 10;
        }
        #btn {
            position: absolute;
            z-index: 0;
            color: black;
        }
    </style>
    
<script type="text/javascript">
         //步骤2
        function setImagePreview() {
            var docObj = document.getElementById("input_file");
            var imgObjPreview = document.getElementById("myimg");

            var reader = new FileReader();
            reader.readAsDataURL(docObj.files[0]);
            reader.onload = function (e) {
                var dataobj = this.result;
                 
                imgObjPreview.src = dataobj;
                imgObjPreview.onload=function(){
                var cropStr =compress(imgObjPreview,800,800,1.0);
                console.log("cropStr:" + cropStr);//压缩后的base64  带前缀的
                var dot = cropStr.indexOf(",");
                var newBase64Data = cropStr.substring(dot + 1, cropStr.length);

                //console.log("newBase64Data:"+newBase64Data);
                localStorage.setItem("base64data", newBase64Data);
                //步骤3
                jump();
                }
               

               
            }


        }

           /* 
            * 图片压缩
            * img    原始图片
            * width   压缩后的宽度
            * height  压缩后的高度
            * ratio   压缩比率 
            */
         function compress(img, width, height, ratio) {
               var canvas, ctx, img64;
               canvas = document.getElementById('canv');
               canvas.width = width;
               canvas.height = height;

               ctx = canvas.getContext("2d");
               ctx.drawImage(img, 0, 0, width, height);//把图片绘制到画布上

               img64 = canvas.toDataURL("image/jpeg", ratio);

               return img64;
         }

        function jump() {
            //window.setTimeout("window.location.href='cardRecognition.html'", 5000);
            var file = document.getElementById("input_file");
            // for IE, Opera, Safari, Chrome
            if (file.outerHTML) {
                file.outerHTML = file.outerHTML;
            } else { // FF(包括3.5)
                file.value = "";
            }
            window.location.href = "cardRecognition.html";

        }
    </script>
</head>

<body>
    <div><!--步骤1-->
        <input type="button" value="名片识别" id="btn" disabled="disabled" />
        <input type="file" accept="image/*" multiple="multiple" id="input_file" onchange="setImagePreview()" />
        <input type="hidden" id="img" name="img" value="" />
    </div>
    <div>
        <canvas id="canv" width="400" height="400" style="border:1px solid red;"></canvas>
        <img id="myimg" src="" alt="预览" width="400" height="400" />
    </div>
</body>
</html>

第二个页面

 

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>名片识别</title>
    <link rel="stylesheet" type="text/css" href="../css/loader.min.css">
    <script src="../js/jquery-3.2.1.min.js"></script>
    <style type="text/css">
    </style>
    <script type="text/javascript">
        $(function () {
            var key = "FxxxxxxxxxxxxxxMy";
            var secret = "1cc1xxxxxxxxxxxxxeb243c87a";
            var typeId = 20;
            var format = "json";
            var base64Data = localStorage.getItem("base64data");
            //var test=localStorage.getItem("test");
            localStorage.clear();
            //console.log(base64Data);
            //alert(base64Data);
            //alert(test);
            requestData();
            ///调取翔云orc接口//
            function requestData() {
                var oData = { "img": base64Data, "key": key, "secret": secret, "typeId": typeId, "format": format };
                $.ajax({
                     url: "https://www.xxx.com/api/xxx",
              
                    type: 'POST',
                    dataType: "json",//注意,此处设置为text,可以在ie中解析返回的xml
                    data: oData,
                    success: function (returndata) {
                        if (returndata != null) {
                            var jsonresult = JSON.stringify(returndata);
                            var mdata = $.parseJSON(jsonresult);
                            console.log(mdata);
                            var len = mdata.cardsinfo[0].items.length;
                            for (var i = 0; i <= len - 1; i++) {
                                item = mdata.cardsinfo[0].items[i];
                                $("#tb").append("<tr></tr><td style=\"border: 1px solid #000;width: 100px\">" + item.desc + "</td>" +
                                    "<td style=\"border: 1px solid #000;width: 300px\">" + item.content + "</td></tr>");
                            }
                            //移除loading
                            $('body').addClass('loaded');
                            $('#loader-wrapper .load_title').remove();
                        }

                    },
                    error: function (returndata) {
                        alert("请求失败");
                    }
                });
            }
        });

    </script>
</head>
<body>
    <div id="loader-wrapper">
        <!--loading-->
        <div id="loader"></div>
        <div class="loader-section section-left"></div>
        <div class="loader-section section-right"></div>
        <div class="load_title">正在识别名片
            <br> </div>
    </div>
    <div id="dv" align="center">
        <table id="tb" style="text-align: center;">
        </table>
    </div>
</body>
</html>

-----------------------以上是实现步骤,以下是开发时遇到的问题--------------------------------

在实现的时候有几个问题:

1.华为手机自带浏览器无法打开摄像头

打开手机摄像头或者相册使用的h5的input标签,设置accept="image/*" multiple="multiple" 属性,无法打开摄像头,百度了好多也没有找到解决方案,最后考虑到用户习惯,用户很少用手机自带浏览器,下载了谷歌浏览器和uc浏览器进行测试,没有问题,可以正常打开手机摄像头和相册;

2.使用H5的input type=file标签,会自带样式:

通过修改它的样式,主要是将其透明图设置成0,将其隐藏掉,自己再写个input type=button的按钮覆盖到上面,看起来就是只点击按钮了。

3.点击拍摄或者相册选取图片,获取base64数据,base64数据太长,无法解析。

一开始在电脑的谷歌浏览器进行测试,直接选取的网络上的图片,传图片的base64可以正常解析,但是放到手机上,通过拍摄获取到的图片转成base64数据会很大(5M),我看了下是直接传图(80k)的64倍,可能随图片大小不同,这个数据有差别,后来打算使用压缩后的图片转base64来进行解析,压缩后的base64再转成图是一片黑,压缩失败。后来回来看了下压缩代码,压缩过程是这样的:

/* 
            * 图片压缩
            * img    原始图片
            * width   压缩后的宽度
            * height  压缩后的高度
            * ratio   压缩比率 
            */
         function compress(img, width, height, ratio) {
               var canvas, ctx, img64;
               canvas = document.getElementById('canv');
               canvas.width = width;
               canvas.height = height;

               ctx = canvas.getContext("2d");
               ctx.drawImage(img, 0, 0, width, height);//把压缩后的图片绘制到画布上

               img64 = canvas.toDataURL("image/jpeg", ratio);

               return img64;
         }

这个方法本身是没有问题的,但是放到代码中会有问题,问题出在ctx.drawImage(img, 0, 0, width, height);这句上,img一直无法绘制到画布上,原来是img.src 还没有加载完就开始绘制肯定绘制不上,所以调用img.onload,等到img加载完成后再进行绘制就可以了,最后正确获得压缩后的图片的base64数据。

ok,以上就是一个简单的总结,记录一下。


 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值