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版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
3月前
|
安全 Java 开发者
告别NullPointerException:Java Optional实战指南
告别NullPointerException:Java Optional实战指南
293 119
|
4月前
|
人工智能 Java API
Java AI智能体实战:使用LangChain4j构建能使用工具的AI助手
随着AI技术的发展,AI智能体(Agent)能够通过使用工具来执行复杂任务,从而大幅扩展其能力边界。本文介绍如何在Java中使用LangChain4j框架构建一个能够使用外部工具的AI智能体。我们将通过一个具体示例——一个能获取天气信息和执行数学计算的AI助手,详细讲解如何定义工具、创建智能体并处理执行流程。本文包含完整的代码示例和架构说明,帮助Java开发者快速上手AI智能体的开发。
1522 8
|
4月前
|
人工智能 Java API
Java与大模型集成实战:构建智能Java应用的新范式
随着大型语言模型(LLM)的API化,将其强大的自然语言处理能力集成到现有Java应用中已成为提升应用智能水平的关键路径。本文旨在为Java开发者提供一份实用的集成指南。我们将深入探讨如何使用Spring Boot 3框架,通过HTTP客户端与OpenAI GPT(或兼容API)进行高效、安全的交互。内容涵盖项目依赖配置、异步非阻塞的API调用、请求与响应的结构化处理、异常管理以及一些面向生产环境的最佳实践,并附带完整的代码示例,助您快速将AI能力融入Java生态。
728 12
|
4月前
|
Java 开发者
Java并发编程:CountDownLatch实战解析
Java并发编程:CountDownLatch实战解析
492 100
|
4月前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
492 0
|
5月前
|
数据采集 JSON Java
Java爬虫获取1688店铺所有商品接口数据实战指南
本文介绍如何使用Java爬虫技术高效获取1688店铺商品信息,涵盖环境搭建、API调用、签名生成及数据抓取全流程,并附完整代码示例,助力市场分析与选品决策。
|
5月前
|
算法 Java 开发者
Java流程控制:条件与循环结构实战
本文深入讲解编程中的流程控制结构,涵盖条件语句(if-else、switch)、循环结构(for、while、do-while)及循环控制关键字(break、continue)的使用技巧与实战案例,帮助开发者写出更清晰、高效的代码。
|
5月前
|
Java API Maven
2025 Java 零基础到实战最新技术实操全攻略与学习指南
本教程涵盖Java从零基础到实战的全流程,基于2025年最新技术栈,包括JDK 21、IntelliJ IDEA 2025.1、Spring Boot 3.x、Maven 4及Docker容器化部署,帮助开发者快速掌握现代Java开发技能。
1090 1
|
5月前
|
Java 关系型数据库 数据库
Java 项目实战教程从基础到进阶实战案例分析详解
本文介绍了多个Java项目实战案例,涵盖企业级管理系统、电商平台、在线书店及新手小项目,结合Spring Boot、Spring Cloud、MyBatis等主流技术,通过实际应用场景帮助开发者掌握Java项目开发的核心技能,适合从基础到进阶的学习与实践。
852 3