假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情请点击http://106.12.206.16:8080/qingruihappy/index.html

一,需求讲解

如图所示,扫描图片的时候,实现银行卡号和银行名称自动回填。

接口网址(事例):http://cloud.exocr.com/

二,代码

2.1,html页面

 1             <input type="file" name="upload" style="display:none;" οnchange="ocrScan(this);" id="upload" accept="image/*"/>
 2
 3
 4  <li class="item-list">
 5                     <span class="name" >银行卡号</span>
 6                     <img class="fr bank-img" οnclick="ocrScanProxy();" src="${rc.contextPath}/js/css/images/Icon_scan@2x.png"/>
 7                     <input class="fr bank-number" id="accountNoShow" name="accountNoShow"  value="${orderParam.accountNoShow?default('')}" placeholder="请填写卡号,扫描可自动填充" />
 8                 </li>
 9
10 function ocrScanProxy(){
11          $("#upload").click();
12     }
13
14     function ocrScan(imgFile){
15         var file = imgFile.files[0];//文件对象
16         var name = file.name;//图片名
17         var url = '${rc.contextPath}/wxInComing.htm?method=ocrScan';
18          $.ajaxFileUpload({
19                 url: url,
20                 secureuri:false,
21                 type: 'POST',
22                 fileElementId:"upload",
23                 dataType: 'json',
24                 success: function (data, status)  //服务器成功响应处理函数
25                        {
26                     var index = data.indexOf('{');
27                     data= data.substring(index, data.length);
28                     var obj = eval('(' + data + ')');
29                              if ("000" == obj.code) {
30                                  $("#accountNo").val(obj.data.cardno.replace(/\s/g,''));
31                                  $("#accountNoShow").val(obj.data.cardno);
32                                  var bankName = obj.data.bankname;
33                                  if(bankName.indexOf('(') > -1) {
34                                      bankName = bankName.substring(0,bankName.indexOf('('))
35                                  }
36                                  $("#bankNameShow").text(bankName);
37                                  $("#bankName").val(bankName);
38                                } else {
39                                  alert(obj.desc);
40                                }
41                        },
42                        error: function (data, status, e)//服务器响应失败处理函数
43                        {
44                            alert(e);
45                        }
46             });
47     }

以上用的是ajaxupload异步提交,解决请求头的问题。一旦发送请求在到达方法前已近把post里面的图片放到这个目录下面去了,

D:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp5\work\Catalina\localhost\项目名,换句话就是说在发送请求之前,到达方法之前就会把这张图片放到这个目录下,一旦请求结束,这张照片就会被删除。

上面的图片中的post转的就是这张图片的二进制的内容。

后续对HttpServletRequest 和response进行细致的了解,https://www.cnblogs.com/xdp-gacl/p/3798347.html这个博文不错

2.2,ocrScan类

 1 public void ocrScan(HttpServletRequest request, HttpServletResponse response) {
 2         Map<String, Object> result = new HashMap<String, Object>();
 3         try {
 4             MultipartHttpServletRequest multipartRequest = null;
 5             multipartRequest = (MultipartHttpServletRequest) request;
 6             MultipartFile inputFile = multipartRequest.getFile("upload");
 7             if(null == inputFile){
 8                 result.put("code", "002");
 9                 result.put("desc", "图片不能为空");
10                 super.toJson(result, response);
11                 return;
12             }
13             Map<String, Object> bankCardRecognize = ocrService.bankCardRecognize(inputFile);
14             if("0".equals(bankCardRecognize.get("Error"))){
15                 result.put("code", "000");
16                 result.put("desc", "sucesss");
17                 result.put("data", bankCardRecognize.get("Result"));
18                 super.toJson(result, response);
19                 return;
20             } else {
21                 result.put("code", bankCardRecognize.get("Error"));
22                 result.put("desc", bankCardRecognize.get("Details"));
23                 super.toJson(result, response);
24                 return;
25             }
26         } catch(Exception e) {
27             logger.error("com.bill99.query.controller.WXinComingController.ocrScan()发生异常,异常信息为:",e);
28             result.put("code", "003");
29             result.put("desc", "ocr识别异常");
30             super.toJson(result, response);
31             return;
32         }
33     }

到这之后可以得到inputfile的参数

MultipartFile inputFile = multipartRequest.getFile("upload");

--这是根据id来获取的异步请求的数据,主要有图片的名称,地址,大小,还有input为file图片格式的name

它的结果为
name=timg.jpg, StoreLocation=D:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp5\work\Catalina\localhost\weixin\upload__6daf3b82_15fa64c1e0f__8000_00000010.tmp, size=103086bytes, isFormField=false, FieldName=upload

在这只不过是图片的一个路径而已,不是二进制的文件,调用的类回去这里面去读取数据的。

现在把这个file传给ocr的识别系统
Map<String, Object> bankCardRecognize = ocrService.bankCardRecognize(inputFile);

2.3,OcrService接口

1 /**
2      * 银行卡识别
3      *
4      * @param imageFile
5      * @return
6      */
7     Map<String, Object> bankCardRecognize(MultipartFile imageFile);

2.4,OcrServiceImpl实现类

1 @Override
2     public Map<String, Object> bankCardRecognize(MultipartFile imageFile) {
3         return ocrServer.pictureRecognition("BankCard", imageFile);
4     }

2.5,ocr服务接口调用类OcrServer

 1 package com.bill99.coe.ocr.client;
 2
 3 import java.io.FileInputStream;
 4 import java.io.IOException;
 5 import java.util.HashMap;
 6 import java.util.Map;
 7
 8 import org.apache.commons.codec.binary.Base64;
 9 import org.slf4j.Logger;
10 import org.slf4j.LoggerFactory;
11 import org.springframework.web.multipart.MultipartFile;
12
13 import com.bill99.boss.domain.service.CpConfigService;
14 import com.bill99.boss.utils.util.JsonUtils;
15 import com.bill99.coe.ocr.utils.HttpUtil;
16
17 /**
18  * ocr服务接口调用
19  *
20  * @author liangjian.sun
21  *
22  */
23 public class OcrServer {
24     /**
25      * 日志
26      */
27     private static Logger logger = LoggerFactory.getLogger(OcrServer.class);
28
29     /**
30      * 配置参数服务
31      */
32     private CpConfigService cpConfigService = null;
33
34     /**
35      * 图片识别
36      * @param recotype
37      *         要识别的证件类型
38      * @param imageFile
39      *         要识别的证件文件
40      * @return Map<String, Object>
41      *         识别结果
42      */
43     public Map<String, Object> pictureRecognition(String recotype, MultipartFile imageFile) {
44         String result = null;
45         // 文件输入流
46         FileInputStream fs = null;
47         try {
48             String configValue = cpConfigService.getValueByConfigKey("ocr_server_config", "{'uri':'http://cloud.exocr.com/recognize','username':'test','password':'test'}");
49             Map<String, String> configMap = JsonUtils.json2Map2(configValue);
50             String postUrl = configMap.get("uri"); // 服务地址
51             Map<String, String> postParam = new HashMap<String, String>(10);
52             postParam.put("username", configMap.get("username")); // 用户名, 公有云测试可使用’test’
53             postParam.put("password", configMap.get("password")); // 密码,公有云测试可使用 ’test’
54             postParam.put("recotype", recotype); // BankCard
55             postParam.put("encoding", "utf-8"); // 返回结果的文字编码方式,取值包括:utf-8, 默认值 gb2312
56             postParam.put("head_portrait", "0"); // 是否返回头像(base64格式),只对身份证识别有效,取值范围:0,默认,不返回头像    1,则返回身份证的头像照片
57             postParam.put("crop_image", "0"); // 是否返回切边(base64格式),取值:0,    默认,不返回切边图    1,    返回切边图
58             postParam.put("b64", "1"); // 输入图片是否为base64格式,取值:0,    默认,二进制格式   1,    base64格式
59             // base64编码图像
60             String base64 = new String(Base64.encodeBase64(imageFile.getBytes()));
61             postParam.put("image", base64); // 待识别的图像,可以是二进制也可以是base64格式
62             result = HttpUtil.postUrlAsString(postUrl, postParam, null, "utf-8");
63             logger.info("OCR识别结果{}", result);
64         } catch (Exception e) {
65             logger.error("OCR识别异常:", e);
66             StringBuilder sb = new StringBuilder();
67             sb.append("{'Error':'99','Details':'OCR识别异常:");
68             sb.append(e.getMessage()).append("'}");
69             result = sb.toString();
70         } finally {
71             if (null != fs) {
72                 try {
73                     fs.close();
74                 } catch (IOException e) {
75                     logger.error("File input stream close exception:", e);
76                 }
77             }
78         }
79
80         try {
81             return JsonUtils.json2Map(result);
82         } catch (Exception e) {
83             logger.error("json to map exception:", e);
84         }
85
86         return null;
87     }
88
89     public void setCpConfigService(CpConfigService cpConfigService) {
90         this.cpConfigService = cpConfigService;
91     }
92
93 }

来获取这个url的接口
String configValue = cpConfigService.getValueByConfigKey("ocr_server_config", "{'uri':'http://cloud.exocr.com/recognize','username':'test','password':'test'}");
把所有的参数封装到postParam参数中来{b64=1, username=test, head_portrait=0, recotype=BankCard, encoding=utf-8, image=/9j/4AA........}
postParam.put("image", base64); // 待识别的图像,可以是二进制也可以是base64格式

2.6,HTTP工具类,HttpUtil

  1 package com.bill99.coe.ocr.utils;
  2
  3 import java.io.UnsupportedEncodingException;
  4 import java.util.ArrayList;
  5 import java.util.List;
  6 import java.util.Map;
  7
  8 import org.apache.commons.lang.StringUtils;
  9 import org.apache.http.Header;
 10 import org.apache.http.HttpResponse;
 11 import org.apache.http.HttpStatus;
 12 import org.apache.http.NameValuePair;
 13 import org.apache.http.client.HttpClient;
 14 import org.apache.http.client.entity.UrlEncodedFormEntity;
 15 import org.apache.http.client.methods.HttpPost;
 16 import org.apache.http.client.methods.HttpUriRequest;
 17 import org.apache.http.impl.client.DefaultHttpClient;
 18 import org.apache.http.message.BasicNameValuePair;
 19 import org.apache.http.params.CoreConnectionPNames;
 20 import org.apache.http.util.EntityUtils;
 21 import org.slf4j.Logger;
 22 import org.slf4j.LoggerFactory;
 23
 24 /**
 25  * HTTP工具类.
 26  *
 27  * @author David.Huang
 28  */
 29 public class HttpUtil {
 30
 31     private static Logger logger = LoggerFactory.getLogger(HttpUtil.class);
 32
 33     /**
 34      * 默认编码方式 -UTF8
 35      */
 36     private static final String DEFAULT_ENCODE = "utf-8";
 37
 38     /**
 39      * POST请求, 结果以字符串形式返回.
 40      *
 41      * @param url
 42      *            请求地址
 43      * @param params
 44      *            请求参数
 45      * @param reqHeader
 46      *            请求头内容
 47      * @param encode
 48      *            编码方式
 49      * @return 内容字符串
 50      * @throws Exception
 51      */
 52     public static String postUrlAsString(String url,
 53             Map<String, String> params, Map<String, String> reqHeader,
 54             String encode) throws Exception {
 55         // 开始时间
 56         long t1 = System.currentTimeMillis();
 57         // 获得HttpPost对象
 58         HttpPost httpPost = getHttpPost(url, params, encode);
 59         // 发送请求
 60         String result = executeHttpRequest(httpPost, reqHeader, encode);
 61         // 结束时间
 62         long t2 = System.currentTimeMillis();
 63         // 调试信息
 64         logger.debug("url:" + url);
 65         logger.debug("params:" + params.toString());
 66         logger.debug("reqHeader:" + reqHeader);
 67         logger.debug("encode:" + encode);
 68         logger.debug("result:" + result);
 69         logger.debug("consume time:" + ((t2 - t1)));
 70         // 返回结果
 71         return result;
 72     }
 73
 74     /**
 75      * 获得HttpPost对象
 76      *
 77      * @param url
 78      *            请求地址
 79      * @param params
 80      *            请求参数
 81      * @param encode
 82      *            编码方式
 83      * @return HttpPost对象
 84      * @throws UnsupportedEncodingException
 85      */
 86     private static HttpPost getHttpPost(String url, Map<String, String> params,
 87             String encode) throws UnsupportedEncodingException {
 88         HttpPost httpPost = new HttpPost(url);
 89         if (params != null) {
 90             List<NameValuePair> form = new ArrayList<NameValuePair>();
 91             for (String name : params.keySet()) {
 92                 form.add(new BasicNameValuePair(name, params.get(name)));
 93             }
 94
 95             UrlEncodedFormEntity entity = new UrlEncodedFormEntity(form,
 96                     encode);
 97             httpPost.setEntity(entity);
 98         }
 99
100         return httpPost;
101     }
102
103     /**
104      * 执行HTTP请求
105      *
106      * @param request
107      *            请求对象
108      * @param reqHeader
109      *            请求头信息
110      * @return 内容字符串
111      */
112     private static String executeHttpRequest(HttpUriRequest request,
113             Map<String, String> reqHeader, String encode) throws Exception {
114         HttpClient client = null;
115         String result = null;
116         try {
117             // 创建HttpClient对象
118             client = new DefaultHttpClient();
119             // 设置连接超时时间
120             client.getParams().setParameter(
121                     CoreConnectionPNames.CONNECTION_TIMEOUT, 60);
122             // 设置Socket超时时间
123             client.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,
124                     36600);
125             // 设置请求头信息
126             if (reqHeader != null) {
127                 for (String name : reqHeader.keySet()) {
128                     request.addHeader(name, reqHeader.get(name));
129                 }
130             }
131             // 获得返回结果
132             HttpResponse response = client.execute(request);
133             // 如果成功
134             if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
135                 encode = StringUtils.isNotEmpty(encode) ? encode : DEFAULT_ENCODE;
136                 result = EntityUtils.toString(response.getEntity(), encode);
137             } else {
138                 StringBuffer errorMsg = new StringBuffer();
139                 errorMsg.append("httpStatus:");
140                 errorMsg.append(response.getStatusLine().getStatusCode());
141                 errorMsg.append(response.getStatusLine().getReasonPhrase());
142                 errorMsg.append(", Header: ");
143                 Header[] headers = response.getAllHeaders();
144                 for (Header header : headers) {
145                     errorMsg.append(header.getName());
146                     errorMsg.append(":");
147                     errorMsg.append(header.getValue());
148                 }
149                 logger.error("HttpResonse Error:" + errorMsg);
150                 result = "{'Error':'98','Details':'" + errorMsg.toString() + "'}";
151             }
152         } catch (Exception e) {
153             logger.error("http连接异常", e);
154             throw new Exception("http连接异常");
155         } finally {
156             try {
157                 client.getConnectionManager().shutdown();
158             } catch (Exception e) {
159                 logger.error("finally HttpClient shutdown error", e);
160             }
161         }
162         return result;
163     }
164 }

仿照浏览器把参数全部分装到httpPost请求当中来,最主要的就是url路径,参数,和编码格式httppost的用法(NameValuePair(简单名称值对节点类型))
HttpPost httpPost = getHttpPost(url, params, encode);
通过httpclient来把数据传到orc的服务器并返回结果。httpclient的讲解
String result = executeHttpRequest(httpPost, reqHeader, encode);

。。。。。

返回的结果{Error=0, Details=识别正确, Result={bankname=中银通支付(480800010000), cardname=安徽合肥通卡, cardtype=预付费卡, cardno=9210 0001 0000 1595 143, expmonth=0, expyear=0}}

2.7,识别返回的json格式文档

1 银行卡识别结果JSON数据定义:
2         "bankname"   --------------银行名称
3     "cardname"  --------------卡名
4     "cardtype"  --------------卡类型
5     “cardno”    -------------卡号
6     “expmonth” ---------------有效期截止月份
7     “expyear”  ----------------有效期截止年份
8     "cropped_image" ---------------切割图

身份证识别,行驶证识别,驾驶证识别,营业执照识别大同小异,主要是返回结果不一样。具体请见微信图片身份证识别,行驶证识别,驾驶证识别,营业执照识

假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情请点击http://106.12.206.16:8080/qingruihappy/index.html

微信识别图片功能实现(以读取银行卡为例)相关推荐

  1. 微信识别图片文字直接导出Word方法

    这时候很多朋友会问手机怎么才能识别图片文字呢?谁说不能!其实手机微信就可以做到这一点!下面为大家分享一个简单易操作方法,只需要对准纸质文档即可一键识别,并导出Word文档,帮你轻松扫描这几张纸质文档! ...

  2. 怎么在线识别图片文字?说一个思路

    图片中的文字怎么在线识别?很多小伙伴在接收到图片类型的文件时,不知道怎么处理其中记录的信息.打字整理嫌麻烦怕出错的话,可以借助识别软件来处理,下面给大家介绍三种比较好用的工具,希望能解决你的问题. 方 ...

  3. 微信小程序识别图片并提取文字_图片转文字识别功能的小程序,超精准识别——闪电识字...

    假设你得到了一个纸质文件的任务.比如,杂志.彩页或者你合作伙伴发给你的PDF合同需要你重新编辑,很明显,用人工手打的方式,会耗费不少时间. 相信在如今这个智能化时代,多数人第一时间想到的都会是利用工具 ...

  4. python在汽车上的应用_python实现图片识别汽车功能

    本文实例为大家分享了python实现图片识别汽车的具体代码,供大家参考,具体内容如下 准备工作 1.登陆开发者控制台 2.安装 pip install baidu-aip 模块 原理读取图片的二进制信 ...

  5. 微信自动回复+图片识别

    之前写了深度学习环境的搭建,并在环境中搭建了深度神经网络加以训练,最终完成了猫狗图片的分类.那么,是否可以利用训练得到的模型,在其他应用场景完成拓展呢? 本文将利用itchat和图灵机器人(可以不用图 ...

  6. 微信推出图片“大爆炸”功能:长按图片可快速提取文字!

    微信又添新功能了!微信在最新版本中,终于上线了[长按图片提取文字]这个功能了! 在微信安卓最新版本中,支持快速识别并提取图片上的文字信息.用户只需长按图片,选择[提取文字],就可以快速将图片中包含的文 ...

  7. Android实现二维码扫描功能-ZXing识别图片二维码,相册选图

    文章目录 1.演示 2.权限问题 3.实现步骤 4.工具类 5.图片Uri处理(重要更新) 1.演示 2.权限问题 部分朋友在打开相册时遇到读写权限未授权的问题,我在开发的时候没有遇到,也没有注册读写 ...

  8. AI识别 图片识别 微信小程序(手写OCR)

    使用腾讯云手写OCR API的微信小程序 GitHub地址 主要功能:识别图片形式的手写笔记并展示 //appid等作为全局变量定义在了app.js里//使用时需将相应字段添加到app.js文件中gl ...

  9. android点击加号,Android仿微信朋友圈点击加号添加图片功能

    本文为大家分享了类似微信朋友圈,点击+号图片,可以加图片功能,供大家参考,具体内容如下 xml: xmlns:app="http://schemas.android.com/apk/res- ...

最新文章

  1. 大数据可视化技术面临的挑战及应对措施
  2. php168站内统计,PHP168整站系统0DAY
  3. 朱棣文在哈佛大学毕业典礼上的演讲
  4. 微信小程序 app.js 操作 页面js方法
  5. python中if命令简单介绍及注意事项(含笔记)
  6. HTML标记也可以乘坐标签,XHTML标签都有一个结束标记
  7. Linux基础之vim文本编辑器
  8. 设置 jetbrains 的背景颜色和字体。
  9. 基于stc15f2k60s2芯片单片机编程(可调时钟)
  10. 分支限界法之布线问题
  11. Vue中使用 Aplayer 和 Metingjs 添加音乐插件
  12. 创业故事之 有限元软件
  13. WHM(Web Hosting Manager)/CPANEL 设置及linux 文件权限 经验
  14. JQuery显示和隐藏div
  15. 西安电子科技大学和东北大学计算机,东北大学分数线比西安电子科技大学低,为什么高校排名靠前?...
  16. 个人投资课 张潇雨_张潇雨·个人投资课笔记
  17. 如何准备阿里社招面试,顺谈Java程序员学习中各阶段的建议
  18. 学习整理自用——计算机基础路径
  19. 视频直播类软件怎么测试,亲测视频直播类软件
  20. UVALive 3351 Easy and Not Easy Sudoku Puzzles 位运算~判断简单数独

热门文章

  1. 基于FPGA的DDS实现
  2. island of java_LeetCode算法题-Island Perimeter(Java实现)
  3. Thinkphp开发的周易起名网程序源码
  4. uniapp微信小程序自定义相机 ,给相机添加辅助框,解决拒绝相机默认授权后无法再次拉起相机授权问题
  5. 精品基于Uniapp+Springboot实现的Android的学习生活交流APP
  6. 12306火车票最新购票软件
  7. 毕业五年java研发求职经历
  8. thinksns 分页数据
  9. 数学建模Day6 典型相关分析
  10. vue的二维码生成器