功能描述:

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

实现步骤:

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

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

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

豌豆资源搜索网站https://55wd.com

代码:

第一个页面

<!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: .0rem;
/*2.4*10px=24px*/
}
#input_file {
position: absolute;
/*相对于最近的祖先元素定位,如果absolute的元素,没有被positioned的祖先元素,那么他是相对于文档的body元素来定位的;一个“positioned”元素是指 position 值不是 static 的元素*/
left: 8px;
opacity: ;
z-index: ;
}
#btn {
position: absolute;
z-index: ;
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[]);
reader.onload = function (e) {
var dataobj = this.result; imgObjPreview.src = dataobj;
imgObjPreview.onload=function(){
var cropStr =compress(imgObjPreview,,,1.0);
console.log("cropStr:" + cropStr);//压缩后的base64 带前缀的
var dot = cropStr.indexOf(",");
var newBase64Data = cropStr.substring(dot + , 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, , , 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="" height="" style="border:1px solid red;"></canvas>
<img id="myimg" src="" alt="预览" width="" height="" />
</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 = "Fna5PKtWYEGE3uCkyZvoMy";
var secret = "1cc17342718546f9a535a15eb243c87a";
var typeId = ;
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.netocr.com/api/recogliu.do",
//url:"http://101.200.79.184/api/recogliu.do",
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[].items.length;
for (var i = ; i <= len - ; i++) {
item = mdata.cardsinfo[].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, , , 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,以上就是一个简单的总结,记录一下。

很实用的h5实现名片扫描识功能快速结合市场运营的更多相关文章

  1. 翻了翻element-ui源码,发现一个很实用的指令clickoutside

    前言 指令(directive)在 vue 开发中是一项很实用的功能,指令可以绑定到某一元素或组件,使功能的颗粒度更精细.今天在翻 element-ui 的源码时,发现一个还挺实用的工具指令,跟大伙分 ...

  2. Connectify是一款很实用的免费软件。能把计算机变成一个无线路由器

    Connectify是一款很实用的免费软件.能把计算机变成一个无线路由器.它能通过您计算机上的无线网卡发射一个无线AP,让有WiFi功能的设备(手机.笔记本)上网.3.0版以前仅支持32位Window ...

  3. 很实用的50个CSS代码片段

    原文:50 Useful CSS Snippets Every Designer Should Have          面对每年如此多的 新趋势 ,保持行业的率先是个非常困难问题. 站点设计者和前 ...

  4. Web 开发中很实用的10个效果【附源码下载】

    在工作中,我们可能会用到各种交互效果.而这些效果在平常翻看文章的时候碰到很多,但是一时半会又想不起来在哪,所以养成知识整理的习惯是很有必要的.这篇文章给大家推荐10个在 Web 开发中很有用的效果,记 ...

  5. 分享15款很实用的 Sass 和 Compass 工具

    Sass 是 CSS 的扩展,增加了嵌套规则,变量,混入功能等很多更多.它简化了组织和维护 CSS 代码的成本.Compass 是一个开源的 CSS 框架,使得使用 CSS3 和流行的设计模式比以往任 ...

  6. 一款很实用的jQuery鼠标悬浮有动画效果的响应式瀑布流插件

    一款很实用的jQuery鼠标悬浮有动画效果的响应式瀑布流插件 在线预览 下载地址 实例代码 <!doctype html> <html lang="zh"> ...

  7. 网站开发中很实用的 HTML5 & jQuery 插件

    这篇文章挑选了15款在网站开发中很实用的 HTML5 & jQuery 插件,如果你正在寻找能优化网站,使其更具创造力和视觉冲击,那么本文正是你需要的.这些优秀的 jQuery 插件能为你的网 ...

  8. [C语言]一个很实用的服务端和客户端进行TCP通信的实例

    本文给出一个很实用的服务端和客户端进行TCP通信的小例子.具体实现上非常简单,只是平时编写类似程序,具体步骤经常忘记,还要总是查,暂且将其记下来,方便以后参考. (1)客户端程序,编写一个文件clie ...

  9. Linux下几个常用的快捷键,真的很实用

    1. [tab] 键 在linux所有的shell中,[tab]是最常用的也是linux的bash  shell中最棒的功能:它具有命令补全和档案补全的功能.如果不使用[tab]键,那就别说自己懂li ...

随机推荐

  1. java实现转方阵

    /* 对一个方阵转置,就是把原来的行号变列号,原来的列号变行号 例如,如下的方阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 转置后变为: 1 5 9 13 2 6 ...

  2. Java实现无向图的欧拉回路判断问题

    1 问题描述 Problem Description 欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路.现给定一个图,问是否存在欧拉回路? Input 测试输入包含若干测试 ...

  3. java实现第六届蓝桥杯打印大X

    打印大X 打印大X 小明希望用星号拼凑,打印出一个大X,他要求能够控制笔画的宽度和整个字的高度. 为了便于比对空格,所有的空白位置都以句点符来代替. 要求输入两个整数m n,表示笔的宽度,X的高度.用 ...

  4. js-ajax方法详解以及封装

    本文主要从使用ajax请求的步骤.ajax状态码和http响应状态码以及ajax封装三个方面阐述 一.使用ajax请求的步骤 // 一.创建 XMLHttpRequest 对象 var xhr = n ...

  5. (易忘篇)java基本语法难点3

    本博客随笔主要记录本人学习过程中的知识,欢迎大家一同学习,有不对的地方很高兴读者能详细指出,感激不尽! JVM内存结构 编译完源程序以后,生成一个或多个字节码文件. 我们使用JVM中的类的加载器和解释 ...

  6. .NET Core SDKs installed: No SDKs were found.

    问题描述 今天vs2019创建了asp.net core项目,发现无法加载项目.尝试打开之前的.net core项目项目,同样无法加载项目. 打开cmd,输入 dotnet ,提示 .NET Core ...

  7. vuex登录验证及保持登录状态

    不知道vuex的可以先看一下 vuex官方文档,这里就不赘述了. 实现思路:假设我们现在想要访问自己在博客园里写的博客,这时候服务器需要知道当前用户是谁,才能确定我们是否有访问权限并正确地返回我们需要 ...

  8. python抓取网页引用的模块和类

    在Python3.x中,我们可以使用urlib这个组件抓取网页,urllib是一个URL处理包,这个包中集合了一些处理URL的模块,如下:1.urllib.request模块用来打开和读取URLs:2 ...

  9. Spring系列.AOP使用

    AOP简介 利用面向对象的方法可以很好的组织代码,也可以继承的方式实现代码重用.但是项目中总是会出现一些重复的代码,并且不太方便使用继承的方式把他们重用管理起来,比如说通用日志打印,事务处理和安全检查 ...

  10. cc28c_demo.cpp,派生类的构造函数和析构函数-代码示范3

    cc28c_demo.cpp,派生类的构造函数和析构函数-代码示范3 //派生类的构造函数和析构函数//派生类的构造函数(执行步骤)//--执行基类的构造函数//--执行成员对象的构造函数//--执行 ...