我们在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中识别二维码并且提高二维码的识别率相关推荐

  1. java 中线程池的种类,原理以及源码解析(1)

    java 中的线程池创建都是Executors 类中提供的方法,并且方法返回线程池对象. Executors 源码: // // Source code recreated from a .class ...

  2. java中j 和 j啥区别_从字节码层次分析++j和j++的区别

    一.缘起 最近看到个面试题: int j = 0; for(int i = 0; i <100; i++) j = j++; System.out.println(j); 输出结果是0,如果换成 ...

  3. Java中字符串拼接的几种方式(源码分析)

    字符串拼接是我们在Java代码中比较经常要做的事情,就是把多个字符串拼接到一起. 我们都知道,String是Java中一个不可变的类,所以他一旦被实例化就无法被修改. 不可变类的实例一旦创建,其成员变 ...

  4. Java中0xFF是什么意思?计算机的原码、补码和反码

    公司项目中有向MCU发数据的代码,新来的同事对其中的& 0xFF很不理解,我解释了很多遍他还是蒙圈状态,可能我的表达能力太差,想想还是用一篇博客来详细说明吧,代码如下: 更新:07月10日,有 ...

  5. java中注解动态传参_Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)...

    Java自定义注解源码+原理解释(使用Java自定义注解校验bean传入参数合法性)java 前言:因为前段时间忙于写接口,在接口中须要作不少的参数校验,本着简洁.高效的原则,便写了这个小工具供本身使 ...

  6. 【JavaSE_06】Java中的数组(array)-提高练习

    #1.求1!+2!+3!+···+30!的和,定义一个方法 public class Test1{public static void main(String[] args){//1.求1!+2!+3 ...

  7. java中static作用详解(版本二)

    static 属于全局,也就是类的属性 和方法,换句话说 一个类,不管有多少个实例,却只有一个全局变量 class B {static int a=0;} B b1=new B();......... ...

  8. java中输入字符串并输入每个汉字的ASC码

    Scanner reader = new Scanner(System.in);String s = reader.nextLine();for(int i = 0; i < s.length( ...

  9. java中jsp时间插件_日期插件 - WEB源码|JSP源码/Java|源代码 - 源码中国

    日期插件\My97DatePicker\calendar.js 日期插件\My97DatePicker\lang\en.js 日期插件\My97DatePicker\lang\zh-cn.js 日期插 ...

最新文章

  1. MyBatis if标签的用法
  2. 更改windows域名
  3. Android UI开发第一篇——android的九宫格式实现
  4. 交叉表 列字段排序_PowerBI创建日期表
  5. day22 模块-collections,time,random,pickle,shelve等
  6. MVC与WebForm最大的区别
  7. centos光盘修复引导_CentOS 6.5 修复grub引导
  8. 如何为复杂页面实现过渡页面
  9. 【实物】端到端自动驾驶搭建教程(二)附完整资料
  10. 约瑟夫环两种解题方式
  11. OpenCV 之 角点检测
  12. php随机产生4乘4矩阵,matlab函数rand:产生均匀分布的随机数或矩阵的函数
  13. 【学习笔记】带你从0开始学习 01Trie
  14. 警惕 CONFIG+=ordered
  15. 2022年天梯赛题目解析
  16. 万拓双控存储DS5000
  17. 计算机主机型号查询,如何查询电脑硬件的型号
  18. 基于安卓Android的企业员工管理系统设计与实现
  19. 北海·涠洲岛攻略(两日游)
  20. python调用开源求解器SCIP求解带时间窗车辆路径问题(VRPTW)

热门文章

  1. 【读万卷书】《挪威的森林》
  2. js与朴php订单评价功能
  3. Java旅游管理系统的设计与实现毕业设计
  4. Ansible Inventory内置参数
  5. Java导入证书失败Keystore was tampered with, or password was incorrect
  6. LINUX IIO子系统分析之七 虚拟iio device驱动实现
  7. 手机怎么解除root权限?华为手机root教程
  8. 有没有什么软件可以把视频转文字?看看这些转换软件
  9. Codeforces Round #521 (Div. 3) B. Disturbed People 思维
  10. Hex Editor Neo Ultimate系统要求