Java中识别二维码并且提高二维码的识别率
我们在Java开发的时候,发现对二维码的识别是不足的。所以我们需要提高识别率。
第一步。识别图片二维码。准备相应的jar包。我们在gradle+idea中开发。
compile group: 'com.google.zxing', name: 'core', version: '3.3.0'
compile group: 'com.google.zxing', name: 'javase', version: '3.3.0'
zxing是google提供的生成二维码和识别二维码的jar包。
第二步:准备QRCodeGenerator
import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import sun.misc.BASE64Decoder;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;/*** 二维码相关操作* Created by hongming.zhao on 2019/11/20.*/
public class QRCodeGenerator {private static final int margin = 0;private static final String QR_CODE_IMAGE_PATH = "C:/photo/MyQRCode.png";private static void generateQRCodeImage(String text, int width, int height, String filePath) throws WriterException, IOException {QRCodeWriter qrCodeWriter = new QRCodeWriter();BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height);Path path = FileSystems.getDefault().getPath(filePath);MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path);}/*** 生成二维码(黑白色)* @param text 扫描二维码的内容* @param width 宽* @param height 长* @return* @throws Exception*/public static BufferedImage qRCodeCommon(String text, int width, int height)throws Exception{Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 指定编码方式,防止中文乱码hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 指定纠错等级hints.put(EncodeHintType.MARGIN, margin); // 指定二维码四周白色区域大小BitMatrix bitMatrix = null;try {bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, hints);} catch (WriterException e) {e.printStackTrace();}return MatrixToImageWriter.toBufferedImage(bitMatrix);}/*** 解析二维码解析,此方法是解析Base64格式二维码图片* baseStr:base64字符串,data:image/png;base64开头的*/public static String deEncodeByBase64(String baseStr) {String content = null;BufferedImage image;BASE64Decoder decoder = new BASE64Decoder();byte[] b=null;try {int i = baseStr.indexOf("data:image/png;base64,");baseStr = baseStr.substring(i+"data:image/png;base64,".length());//去掉base64图片的data:image/png;base64,部分才能转换为byte[]b = decoder.decodeBuffer(baseStr);//baseStr转byte[]ByteArrayInputStream byteArrayInputStream=new ByteArrayInputStream(b);//byte[] 转BufferedImageimage = ImageIO.read(byteArrayInputStream);LuminanceSource source = new BufferedImageLuminanceSource(image);Binarizer binarizer = new HybridBinarizer(source);BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);Map<DecodeHintType, Object> hints = new HashMap<DecodeHintType, Object>();hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");Result result = new MultiFormatReader().decode(binaryBitmap, hints);//解码System.out.println("图片中内容: ");System.out.println("content: " + result.getText());content = result.getText();} catch (IOException e) {e.printStackTrace();} catch (NotFoundException e) {e.printStackTrace();}return content;}/*** 解析二维码,此方法解析一个路径的二维码图片* path:图片路径*/public static String deEncodeByPath(String path) {String content = null;BufferedImage image;try {image = ImageIO.read(new File(path));LuminanceSource source = new BufferedImageLuminanceSource(image);Binarizer binarizer = new HybridBinarizer(source);BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);Map<DecodeHintType, Object> hints = new HashMap<DecodeHintType, Object>();hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");Result result = new MultiFormatReader().decode(binaryBitmap, hints);//解码System.out.println("图片中内容: ");System.out.println("content: " + result.getText());content = result.getText();} catch (IOException e) {e.printStackTrace();} catch (NotFoundException e) {e.printStackTrace();}return content;}public static void main(String[] args) {try {//String info="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1575540267760&di=e8b961051b3ab58538e092c5e1be87a1&imgtype=0&src=http%3A%2F%2Fg.hiphotos.baidu.com%2Fzhidao%2Fpic%2Fitem%2Fb8389b504fc2d56263697b8ce51190ef76c66c6a.jpg";String info="C:/photo/6.jpg";deEncodeByPath(info);//generateQRCodeImage("This is my first QR Code", 350, 350, QR_CODE_IMAGE_PATH);//qRCodeCommon("This is my first QR Code", 350, 350);} catch (Exception e) {System.out.println("Could not generate QR Code, WriterException :: " + e.getMessage());}}}
第三步:在controll层中添加
@ApiOperation(value = "生成的登录二维码",notes = "生成的登录二维码",httpMethod = "GET")@RequestMapping(value = "/proCode",method = RequestMethod.GET)public void createQRCode(HttpServletResponse httpServletResponse)throws Exception{HttpServletRequest request=((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();HttpServletResponse response=((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse();System.out.println("生成二维码!");//生成唯一IDString uuid = request.getParameter("uuid");tokes.add(uuid);logger.info("uuid=====>"+uuid);//二维码内容,在手机上登录的是一个是否在手机上确认登录的地址(在app内)。String url=environment.getProperty("mfw.authority.appAffirmurl");String encoderContent=url+uuid+"?date="+(new Date()).getTime();logger.info("perfactUrl====>"+encoderContent);ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();BufferedImage twoDimensionImg = new QRCodeGenerator().qRCodeCommon(encoderContent,350,350);ImageIO.write(twoDimensionImg, "jpg", jpegOutputStream);response.addHeader("Content-Disposition", "attachment;filename=" + new String((uuid+".jpg").getBytes()));byte[] bys = jpegOutputStream.toByteArray();response.addHeader("Content-Length", "" + bys.length);httpServletResponse.setHeader("Cache-Control", "no-store");httpServletResponse.setHeader("Pragma", "no-cache");httpServletResponse.setDateHeader("Expires", 0);httpServletResponse.setContentType("image/jpeg");ServletOutputStream responseOutputStream =httpServletResponse.getOutputStream();responseOutputStream.write(bys);responseOutputStream.flush();responseOutputStream.close();websocketModel wm = new websocketModel();wm.setType("overdue");wm.setUid(uuid);myWebSocket.sendInfo(wm,uuid);//向前端发送消息}
参考:提高zxing对二维码的识别率
zxing 二维码生成深度定制
Java中识别二维码并且提高二维码的识别率相关推荐
- java 中线程池的种类,原理以及源码解析(1)
java 中的线程池创建都是Executors 类中提供的方法,并且方法返回线程池对象. Executors 源码: // // Source code recreated from a .class ...
- java中j 和 j啥区别_从字节码层次分析++j和j++的区别
一.缘起 最近看到个面试题: int j = 0; for(int i = 0; i <100; i++) j = j++; System.out.println(j); 输出结果是0,如果换成 ...
- Java中字符串拼接的几种方式(源码分析)
字符串拼接是我们在Java代码中比较经常要做的事情,就是把多个字符串拼接到一起. 我们都知道,String是Java中一个不可变的类,所以他一旦被实例化就无法被修改. 不可变类的实例一旦创建,其成员变 ...
- Java中0xFF是什么意思?计算机的原码、补码和反码
公司项目中有向MCU发数据的代码,新来的同事对其中的& 0xFF很不理解,我解释了很多遍他还是蒙圈状态,可能我的表达能力太差,想想还是用一篇博客来详细说明吧,代码如下: 更新:07月10日,有 ...
- java中注解动态传参_Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)...
Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)java 前言:因为前段时间忙于写接口,在接口中须要作不少的参数校验,本着简洁.高效的原则,便写了这个小工具供本身使 ...
- 【JavaSE_06】Java中的数组(array)-提高练习
#1.求1!+2!+3!+···+30!的和,定义一个方法 public class Test1{public static void main(String[] args){//1.求1!+2!+3 ...
- java中static作用详解(版本二)
static 属于全局,也就是类的属性 和方法,换句话说 一个类,不管有多少个实例,却只有一个全局变量 class B {static int a=0;} B b1=new B();......... ...
- java中输入字符串并输入每个汉字的ASC码
Scanner reader = new Scanner(System.in);String s = reader.nextLine();for(int i = 0; i < s.length( ...
- java中jsp时间插件_日期插件 - WEB源码|JSP源码/Java|源代码 - 源码中国
日期插件\My97DatePicker\calendar.js 日期插件\My97DatePicker\lang\en.js 日期插件\My97DatePicker\lang\zh-cn.js 日期插 ...
最新文章
- MyBatis if标签的用法
- 更改windows域名
- Android UI开发第一篇——android的九宫格式实现
- 交叉表 列字段排序_PowerBI创建日期表
- day22 模块-collections,time,random,pickle,shelve等
- MVC与WebForm最大的区别
- centos光盘修复引导_CentOS 6.5 修复grub引导
- 如何为复杂页面实现过渡页面
- 【实物】端到端自动驾驶搭建教程(二)附完整资料
- 约瑟夫环两种解题方式
- OpenCV 之 角点检测
- php随机产生4乘4矩阵,matlab函数rand:产生均匀分布的随机数或矩阵的函数
- 【学习笔记】带你从0开始学习 01Trie
- 警惕 CONFIG+=ordered
- 2022年天梯赛题目解析
- 万拓双控存储DS5000
- 计算机主机型号查询,如何查询电脑硬件的型号
- 基于安卓Android的企业员工管理系统设计与实现
- 北海·涠洲岛攻略(两日游)
- python调用开源求解器SCIP求解带时间窗车辆路径问题(VRPTW)
热门文章
- 【读万卷书】《挪威的森林》
- js与朴php订单评价功能
- Java旅游管理系统的设计与实现毕业设计
- Ansible Inventory内置参数
- Java导入证书失败Keystore was tampered with, or password was incorrect
- LINUX IIO子系统分析之七 虚拟iio device驱动实现
- 手机怎么解除root权限?华为手机root教程
- 有没有什么软件可以把视频转文字?看看这些转换软件
- Codeforces Round #521 (Div. 3) B. Disturbed People 思维
- Hex Editor Neo Ultimate系统要求