本文将基于Spring Boot介绍两种生成二维码的实现方式,一种是基于Google开发工具包,另一种是基于Hutool来实现;

为了方便理解二维码的实际应用场景,举一些例子!

(1)进销存系统 想必大家都听说过,其系统中的商品二维码承载了许多重要、核心的关键信息,比如商品编码、商品名称、规格、型号、单位、作用/使用说明等信息;操作者可以借助硬件设备,如“扫码枪”,通过扫描该二维码后将该商品录入到商品库中;

(2)再比如溯源系统中的产品,用户可以通过微信等APP中的扫一扫,扫描贴在产品上的二维码,不出片刻即可得到该产品的相关信息,比如产品名称、生源地、简介、价格、生产环境、经手人等信息;

下面我们将基于Spring Boot,并采用两种方式实现二维码的生成,对于每一种方式还提供两种类型的二维码返回形式,即:物理文件 和 图片响应流

一、基于Google开发工具包ZXing生成二维码

(1)首先,需要在pom.xml依赖配置文件中加入该工具包的依赖Jar,如下所示:

<!-- zxing生成二维码 -->
<dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.3</version>
</dependency><dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.3.3</version>
</dependency>

(2)然后,建立一二维码处理工具类QRCodeUtil,其核心代码如下所示:

/*** 二维码工具* @Author:debug (SteadyJack)* @Link: weixin-> debug0868  qq-> 1948831260* @Date: 2020/11/16 22:38**/
public class QRCodeUtil {private static final Logger log= LoggerFactory.getLogger(QRCodeUtil.class);//CODE_WIDTH:二维码宽度,单位像素private static final int CODE_WIDTH = 400;//CODE_HEIGHT:二维码高度,单位像素private static final int CODE_HEIGHT = 400;//FRONT_COLOR:二维码前景色,0x000000 表示黑色private static final int FRONT_COLOR = 0x000000;//BACKGROUND_COLOR:二维码背景色,0xFFFFFF 表示白色//演示用 16 进制表示,和前端页面 CSS 的取色是一样的,注意前后景颜色应该对比明显,如常见的黑白private static final int BACKGROUND_COLOR = 0xFFFFFF;public static void createCodeToFile(String content, File codeImgFileSaveDir, String fileName) {try {if (StringUtils.isBlank(content) || StringUtils.isBlank(fileName)) {return;}content = content.trim();if (codeImgFileSaveDir==null || codeImgFileSaveDir.isFile()) {//二维码图片存在目录为空,默认放在桌面...codeImgFileSaveDir = FileSystemView.getFileSystemView().getHomeDirectory();}if (!codeImgFileSaveDir.exists()) {//二维码图片存在目录不存在,开始创建...codeImgFileSaveDir.mkdirs();}//核心代码-生成二维码BufferedImage bufferedImage = getBufferedImage(content);File codeImgFile = new File(codeImgFileSaveDir, fileName);ImageIO.write(bufferedImage, "png", codeImgFile);log.info("二维码图片生成成功:" + codeImgFile.getPath());} catch (Exception e) {e.printStackTrace();}}/*** 生成二维码并输出到输出流, 通常用于输出到网页上进行显示,输出到网页与输出到磁盘上的文件中,区别在于最后一句 ImageIO.write* write(RenderedImage im,String formatName,File output):写到文件中* write(RenderedImage im,String formatName,OutputStream output):输出到输出流中* @param content  :二维码内容* @param outputStream :输出流,比如 HttpServletResponse 的 getOutputStream*/public static void createCodeToOutputStream(String content, OutputStream outputStream) {try {if (StringUtils.isBlank(content)) {return;}content = content.trim();//核心代码-生成二维码BufferedImage bufferedImage = getBufferedImage(content);//区别就是这一句,输出到输出流中,如果第三个参数是 File,则输出到文件中ImageIO.write(bufferedImage, "png", outputStream);log.info("二维码图片生成到输出流成功...");} catch (Exception e) {e.printStackTrace();}}//核心代码-生成二维码private static BufferedImage getBufferedImage(String content) throws WriterException {//com.google.zxing.EncodeHintType:编码提示类型,枚举类型Map<EncodeHintType, Object> hints = new HashMap();//EncodeHintType.CHARACTER_SET:设置字符编码类型hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");//EncodeHintType.ERROR_CORRECTION:设置误差校正//ErrorCorrectionLevel:误差校正等级,L = ~7% correction、M = ~15% correction、Q = ~25% correction、H = ~30% correction//不设置时,默认为 L 等级,等级不一样,生成的图案不同,但扫描的结果是一样的hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);//EncodeHintType.MARGIN:设置二维码边距,单位像素,值越小,二维码距离四周越近hints.put(EncodeHintType.MARGIN, 1);MultiFormatWriter multiFormatWriter = new MultiFormatWriter();BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, CODE_WIDTH, CODE_HEIGHT, hints);BufferedImage bufferedImage = new BufferedImage(CODE_WIDTH, CODE_HEIGHT, BufferedImage.TYPE_INT_BGR);for (int x = 0; x < CODE_WIDTH; x++) {for (int y = 0; y < CODE_HEIGHT; y++) {bufferedImage.setRGB(x, y, bitMatrix.get(x, y) ? FRONT_COLOR : BACKGROUND_COLOR);}}return bufferedImage;}
}

总的来说,上面代码主要包含了两个部分,一部分是将实现如何将信息塞入二维码并将其生成图片存储至物理文件目录下;另一部分是实现如何直接将信息塞入二维码并生成图片最终以图片流的形式将其返回给前端调用端;

(3)最后,我们需要新建一个QrCodeController控制器类,并在其中创建两个请求方法,用于测试Google ZXing工具包这种方式生成两种类型的二维码是否可行,其代码如下所示:

@RequestMapping("qr/code")
public class QrCodeController extends BaseController{private static final String RootPath="E:\\shFiles\\QRCode";private static final String FileFormat=".png";private static final ThreadLocal<SimpleDateFormat> LOCALDATEFORMAT=ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyyMMddHHmmss"));//生成二维码并将其存放于本地目录@PostMapping("generate/v1")public BaseResponse generateV1(String content){BaseResponse response=new BaseResponse(StatusCode.Success);try {final String fileName=LOCALDATEFORMAT.get().format(new Date());QRCodeUtil.createCodeToFile(content,new File(RootPath),fileName+FileFormat);}catch (Exception e){response=new BaseResponse(StatusCode.Fail.getCode(),e.getMessage());}return response;}//生成二维码并将其返回给前端调用者@PostMapping("generate/v2")public BaseResponse generateV2(String content,HttpServletResponse servletResponse){BaseResponse response=new BaseResponse(StatusCode.Success);try {QRCodeUtil.createCodeToOutputStream(content,servletResponse.getOutputStream());}catch (Exception e){response=new BaseResponse(StatusCode.Fail.getCode(),e.getMessage());}return response;
}
}

最后是将该项目运行起来并采用Postman对该接口进行测试,首先是控制器第一个方法接口的测试,其测试结果如下图所示(生成的二维码图片是存放在 E:\\shFiles\\QRCode 中的):

最后是控制器第二个方法接口的测试,其测试结果如下图所示:

PS:如果不想存储二维码图片到实际的文件目录,则可以采用“图片流”的形式将其返回即可;反之,则可以将生成的二维码图片存储起来并返回该图片的访问链接给到前端(这个就稍微有点麻烦了,既要存储、又要赋予图片的访问域名和链接);具体取舍可以根据实际业务情况来做抉择吧!

二、基于开源的Hutool工具生成二维码

下面,debug换一种实现方式,采用目前比较知名、流行的开源工具Hutool加以实现,同样的道理需要在pom.xml中加入相应的Jar依赖,如下所示:

 <!--二维码开发工具集--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>4.6.10</version></dependency><!-- zxing生成二维码 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.3</version></dependency><dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.3.3</version></dependency>

然后,需要自定义一Java Config配置文件,以Bean的形式显示配置并注入QrConfig,如下代码所示:

package com.example.qrcode.Config;import cn.hutool.extra.qrcode.QrConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.awt.*;@Configuration
public class QRCode {@Beanpublic QrConfig qrConfig(){QrConfig qrConfig=new QrConfig();qrConfig.setBackColor(Color.white.getRGB());qrConfig.setForeColor(Color.black.getRGB());return qrConfig;}
}

紧接着我们建立一QRService,用于处理真正的生成二维码的业务逻辑,其核心代码如下所示:

package com.example.qrcode.Service;import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import com.example.qrcode.Config.QRCode;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;@Service
public class QRService {@ResourceQrConfig qrconig;public void generateFile(String content, File file){//生成到本地文件QrCodeUtil.generate(content, qrconig, file);}//输出到流public void generateStream(String content, HttpServletResponse response) throws IOException {QrCodeUtil.generate(content,qrconig,"png",response.getOutputStream());}
}

最终,是在QRController控制器类中进行调用,如下代码所示:

package com.example.qrcode.Controller;import com.example.qrcode.Service.QRService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@RestController
public class QRController {@AutowiredQRService qrService;@RequestMapping("123")public void generateV3(String content, HttpServletResponse servletResponse) throws IOException {qrService.generateStream(content,servletResponse);}
}

通过浏览器访问测试:

Java生成二维码的几种实现方式(基于Spring Boot)相关推荐

  1. SpringBoot系列(22):Java生成二维码的几种实现方式(基于Spring Boot)

    原文链接:http://www.fightjava.com/web/index/blog/article/82 在一些企业级应用系统中,有时候需要为产品或者商品生成特定的专属二维码,以供一些硬件设备或 ...

  2. Java生成二维码的两种方法

    本文介绍Java生成二维码的两种方法,这两种方法都依赖于google提供的二维码依赖包. 一种是自己写工具类,代码可以网上抄. 另一种是使用hutool第三方工具类的依赖包,不用自己抄代码. 一.自定 ...

  3. java 生成二维码 QRCode、zxing 两种方式

    版权声明:本文为 testcs_dn(微wx笑) 原创文章,非商用自由转载-保持署名-注明出处,谢谢. https://blog.csdn.net/testcs_dn/article/details/ ...

  4. java 生成二维码后叠加LOGO并转换成base64

    1.代码 见文末推荐 2.测试 测试1:生成base64码 public static void main(String[] args) throws Exception {String data = ...

  5. Java 生成二维码。

    Java 生成二维码. 文章目录 Java 生成二维码. 二维码. 发展. 一维码. 二维码. 优缺点. QR Code. 生成方法. 第三方 jar.eg. zxing 和 qrcodejar. J ...

  6. JAVA生成二维码(二)深度处理

    1.写这个博客的目的 解决JAVA生成二维码(一)中的一些问题. 2.解读排错率,编码模式,版本问题.以下都是自己测试中存在的问题 1.排错率 排错的原理是二维码在编码过程中进行了冗余,就像是123被 ...

  7. Vue中生成二维码的一种方式—vue-qr

    Vue中生成二维码的一种方式-vue-qr vue实现二维码生成(vue + vue-qr)

  8. 二维码相关---java生成二维码名片,并且自动保存到手机通讯录中...

    二维码相关---java生成二维码名片,并且自动保存到手机通讯录中... 技术qq交流群:JavaDream:251572072 1.首先介绍一个api.   Zxing是Google提供的关于条码 ...

  9. java生成二维码打印到浏览器

    java生成二维码打印到浏览器 解决方法: pom.xml的依赖两个jar包: <!-- https://mvnrepository.com/artifact/com.google.zxing/ ...

最新文章

  1. 聊一聊2020年实例分割领域的进展和未来展望
  2. 50个令人大开眼界的 Matplotlib 可视化项目
  3. python怎么重新开始_人人都是数据科学家从新开始用Python学习数据科学的完整教程P3...
  4. 联合索引和多个单列索引选择
  5. 基于matlab的点云重建与三角剖分
  6. 私有云的优缺点_2019年中国云计算行业竞争格局与发展趋势分析「图」
  7. uni-calendar更改打点颜色实现签到和缺勤不同打点颜色效果
  8. 程序员情人节送这些!
  9. 自动将存储过程转成C#代码的过程[转]
  10. 前端小秘密系列之闭包
  11. linux 扩lv文件系统,Linux LVM系列(五)lv xfs文件系统在线扩容
  12. pandas基础知识--1
  13. Android学习笔记五:基本视图组件:Button
  14. noip2017提高组初赛(答案+选择题题目+个人分析)
  15. 篆刻学简体——第一章
  16. UVA - 473 Raucous Rocker 多维dp
  17. 《我的青春谁做主》剧中人物星座分析
  18. Jquery获取选中复选框的值(checkBox)
  19. mysql范围查询如何建索引_MySQL索引(二):建索引的原则
  20. Power BI可视化案例分享

热门文章

  1. 类似于微信发语音Demo
  2. 欢迎来到图数据库的世界——《图数据库实战》中文版上架了!
  3. Python -- Requests库的使用
  4. JSP的forward动作元素和Servlet中forword
  5. SpringBoot+AOP实现动态切换数据源
  6. python functools partial_python标准库--functools.partial
  7. 腾讯游戏 游戏策划 在线笔试模拟考
  8. 两块钱买来的常数变易法
  9. 微信服务号自定义服务器配置及验证
  10. java实验报告心得体会通用,不可思议!