Java实战:Java使用Zxing二维码生成案例

简介: ZXing(Zebra Crossing)是Google开发的一个二维码解析和生成的开源库。

24be4df6bdebfbeb143fe5130e9b5909.jpg


1、二维码简介

二维条形码是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值内容信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理。二维码具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化等特点。

二维码纠错级别

二维码纠错级别指的是在识别二维码时,对于损坏或模糊的二维码的容错能力。一般来说,二维码有四个纠错级别:L (低):可以纠正7%左右的错误。M (中):可以纠正15%左右的错误。Q (高):可以纠正25%左右的错误。H (高):可以纠正30%左右的错误。总结:一般来说,使用较高的纠错级别会导致生成的二维码更大,但是它的容错能力也会更强。


2、ZXing简介

ZXing(Zebra Crossing)是Google开发的一个二维码解析和生成的开源库。官网地址:http://code.google.com/p/zxing/

3、示例

通过Java调用Zxing实现二维码的生成

3.1 搭建一个maven项目,引入Zxing依赖包


<dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.3.0</version></dependency>



3.2 创建QrCodeUtil.java 类

具体实现代码如下:

packageQrCodeUtil;
importjava.awt.BasicStroke;
importjava.awt.Color;
importjava.awt.Graphics2D;
importjava.awt.image.BufferedImage;
importjava.io.File;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.OutputStream;
importjava.util.Date;
importjava.util.Hashtable;
importjavax.imageio.ImageIO;
importcom.alibaba.druid.util.StringUtils;
importcom.google.zxing.BarcodeFormat;
importcom.google.zxing.EncodeHintType;
importcom.google.zxing.MultiFormatWriter;
importcom.google.zxing.WriterException;
importcom.google.zxing.common.BitMatrix;
importcom.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
/*** 生成二维码*/publicclassQrCodeUtil {
privatestaticfinalintBLACK=0xFF000000;
privatestaticfinalintWHITE=0xFFFFFFFF;
privatestaticfinalintmargin=0;
privatestaticfinalintLogoPart=4;
publicstaticvoidmain(String[] args) throwsWriterException {
//二维码内容Stringcontent="IT技术分享社区,一个有态度的互联网社区交流平台";
StringlogoPath="D:\\logo.png"; // 二维码中间的logo信息 非必须Stringformat="jpg";
intwidth=120; // 二维码宽度intheight=120;// 二维码高度// 设置二维码矩阵的信息BitMatrixbitMatrix=setBitMatrix(content, width, height);
// 设置输出流OutputStreamoutStream=null;
Stringpath="d:/Code"+newDate().getTime() +".png";//设置二维码的文件名try {
outStream=newFileOutputStream(newFile(path));
// 目前 针对容错等级为H reduceWhiteArea  二维码空白区域的大小 根据实际情况设置,如果二维码内容长度不固定的话 需要自己根据实际情况计算reduceWhiteArea的大小writeToFile(bitMatrix, format, outStream, logoPath, 5);
outStream.close();
        } catch (Exceptione) {
e.printStackTrace();
        }
    }
/*** 设置生成二维码矩阵信息* @param content 二维码图片内容* @param width   二维码图片宽度* @param height  二维码图片高度* @throws WriterException*/privatestaticBitMatrixsetBitMatrix(Stringcontent, intwidth, intheight) throwsWriterException {
BitMatrixbitMatrix=null;
Hashtable<EncodeHintType, Object>hints=newHashtable<EncodeHintType, Object>();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 指定编码方式,避免中文乱码hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 指定纠错等级 如果二维码里面的内容比较多的话推荐使用H 容错率30%, 这样可以避免一些扫描不出来的问题hints.put(EncodeHintType.MARGIN, margin); // 指定二维码四周白色区域大小 官方的这个方法目前没有没有作用默认设置为0bitMatrix=newMultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
returnbitMatrix;
    }
/*** @param matrix* @param format* @param outStream* @param logoPath        logo图片* @param reduceWhiteArea 二维码空白区域设置* @throws IOException*/privatestaticvoidwriteToFile(BitMatrixmatrix, Stringformat, OutputStreamoutStream, StringlogoPath, intreduceWhiteArea) throwsIOException {
BufferedImageimage=toBufferedImage(matrix, reduceWhiteArea);
// 如果设置了二维码里面的logo 加入LOGO水印if (!StringUtils.isEmpty(logoPath)) {
image=addLogo(image, logoPath);
        }
ImageIO.write(image, format, outStream);
    }
/**** @param matrix* @param reduceWhiteArea* @return*/privatestaticBufferedImagetoBufferedImage(BitMatrixmatrix, intreduceWhiteArea) {
intwidth=matrix.getWidth();
intheight=matrix.getHeight();
BufferedImageimage=newBufferedImage(width-2*reduceWhiteArea, height-2*reduceWhiteArea, BufferedImage.TYPE_3BYTE_BGR);
for (intx=reduceWhiteArea; x<width-reduceWhiteArea; x++) {
for (inty=reduceWhiteArea; y<height-reduceWhiteArea; y++) {
image.setRGB(x-reduceWhiteArea, y-reduceWhiteArea, matrix.get(x, y) ?BLACK : WHITE);
            }
        }
returnimage;
    }
/*** 给二维码图片中绘制logo信息 非必须* @param image    二维码图片* @param logoPath logo图片路径*/privatestaticBufferedImageaddLogo(BufferedImageimage, StringlogoPath) throwsIOException {
Graphics2Dg=image.createGraphics();
BufferedImagelogoImage=ImageIO.read(newFile(logoPath));
// 计算logo图片大小,可适应长方形图片,根据较短边生成正方形intwidth=image.getWidth() <image.getHeight() ?image.getWidth() /LogoPart : image.getHeight() /LogoPart;
intheight=width;
// 计算logo图片放置位置intx= (image.getWidth() -width) /2;
inty= (image.getHeight() -height) /2;
// 在二维码图片上绘制中间的logog.drawImage(logoImage, x, y, width, height, null);
// 绘制logo边框,可选g.setStroke(newBasicStroke(2)); // 画笔粗细g.setColor(Color.WHITE); // 边框颜色g.drawRect(x, y, width, height); // 矩形边框logoImage.flush();
g.dispose();
returnimage;
    }
}



相关文章
|
3月前
|
存储 Java 开发者
Java Map实战:用HashMap和TreeMap轻松解决复杂数据结构问题!
【10月更文挑战第17天】本文深入探讨了Java中HashMap和TreeMap两种Map类型的特性和应用场景。HashMap基于哈希表实现,支持高效的数据操作且允许键值为null;TreeMap基于红黑树实现,支持自然排序或自定义排序,确保元素有序。文章通过具体示例展示了两者的实战应用,帮助开发者根据实际需求选择合适的数据结构,提高开发效率。
85 2
|
16天前
|
Java
Java基础却常被忽略:全面讲解this的实战技巧!
本次分享来自于一道Java基础的面试试题,对this的各种妙用进行了深度讲解,并分析了一些关于this的常见面试陷阱,主要包括以下几方面内容: 1.什么是this 2.this的场景化使用案例 3.关于this的误区 4.总结与练习
|
1月前
|
Java 程序员
Java基础却常被忽略:全面讲解this的实战技巧!
小米,29岁程序员,分享Java中`this`关键字的用法。`this`代表当前对象引用,用于区分成员变量与局部变量、构造方法间调用、支持链式调用及作为参数传递。文章还探讨了`this`在静态方法和匿名内部类中的使用误区,并提供了练习题。
34 1
|
2月前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
69 6
|
2月前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
3月前
|
存储 消息中间件 安全
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
【10月更文挑战第9天】本文介绍了如何利用JUC组件实现Java服务与硬件通过MQTT的同步通信(RRPC)。通过模拟MQTT通信流程,使用`LinkedBlockingQueue`作为消息队列,详细讲解了消息发送、接收及响应的同步处理机制,包括任务超时处理和内存泄漏的预防措施。文中还提供了具体的类设计和方法实现,帮助理解同步通信的内部工作原理。
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
|
2月前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
80 3
|
2月前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
72 2
|
2月前
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
45 2
|
3月前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
26 1