原文链接:http://www.fightjava.com/web/index/blog/article/82

在一些企业级应用系统中,有时候需要为产品或者商品生成特定的专属二维码,以供一些硬件设备或者用户在手机端扫码查看;其中,该二维码主要承载了该产品的相关核心信息,比如名称、简介、价格、单位、型号以及使用说明等等,本文将基于Spring Boot介绍两种生成二维码的实现方式,一种是基于Google开发工具包,另一种是基于Hutool来实现;

话不多说,咱们直接进入正题~~~

说起这个二维码,想必诸位小伙伴都比较熟悉,它是信息的一种载体,也是信息的一种表示形式,可以很好的承载、保护想要重点维护的产品相关的核心信息;而在软件开发领域,这种形式愈加常见,因此,还是有必要撸一撸相应的代码的!

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

(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;}
}

上述代码有点多,诸位可以在文末提供的下载地址将其下载下来,并用IDEA等开发工具将其打开,几乎每行代码debug都做了必要的注释,在这里就不赘述了!

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

(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>

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

@Configuration
public class QRConfig {//采用JavaConfig的方式显示注入hutool中 生成二维码@Beanpublic QrConfig qrConfig(){//初始宽度和高度QrConfig qrConfig=new QrConfig(300,300);//设置边距,即二维码和边框的距离qrConfig.setMargin(2);//设置前景色qrConfig.setForeColor(Color.BLACK.getRGB());//设置背景色qrConfig.setBackColor(Color.WHITE.getRGB());return qrConfig;}
}

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

@Service
@Slf4j
public class QrCodeService {@Autowiredprivate QrConfig config;//生成到文件public void createCodeToFile(String content, String filePath) {try {QrCodeUtil.generate(content,config,FileUtil.file(filePath));} catch (QrCodeException e) {e.printStackTrace();}}//生成到流public void createCodeToStream(String content, HttpServletResponse response) {try {QrCodeUtil.generate(content,config, "png", response.getOutputStream());} catch (QrCodeException | IOException e) {e.printStackTrace();}}
}

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

@Autowired
private QrCodeService codeService;//生成二维码并将其返回给前端调用者_hutool
@PostMapping("generate/v3")
public BaseResponse generateV3(String content,HttpServletResponse servletResponse){BaseResponse response=new BaseResponse(StatusCode.Success);try {//将生成的二维码文件存放于文件目录中//final String fileName=LOCALDATEFORMAT.get().format(new Date());//codeService.createCodeToFile(content,RootPath+File.separator+fileName+".png");//将生成的二维码文件直接返回给前端响应流codeService.createCodeToStream(content,servletResponse);}catch (Exception e){response=new BaseResponse(StatusCode.Fail.getCode(),e.getMessage());}return response;
}

在上述该代码中,debug也测试了两种形式的二维码的生成,下面采用Postman测试“以图片流的形式返回二维码图片”的方法接口,其测试结果如下图所示:

总结:

(1)代码下载:关注“程序员实战基地”微信公众号,回复“二维码”,即可获取代码下载链接

(2)至此,我们已经介绍完了两种“生成二维码”的实现方式的代码实战;相对而言,显然是第二种用起来比较舒服,即基于Hutool工具包的组件来生成二维码,可以说是既方便又快捷啦,当然啦,其底层仍然是基于Google ZXing工具实现的,即Hutool的工具包的部分组件其实是对第三方工具/组件的高度封装!不信的话,诸位小伙伴可以去撸一撸!

我是debug,一个相信技术改变生活、技术成就梦想 的攻城狮;如果本文对你有帮助,请关注公众号,并动动手指收藏、点赞、以及转发哦!!!

关注一下Debug的技术微信公众号,最新的技术文章、课程以及技术专栏将会第一时间在公众号发布哦!

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

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

    本文将基于Spring Boot介绍两种生成二维码的实现方式,一种是基于Google开发工具包,另一种是基于Hutool来实现: 为了方便理解二维码的实际应用场景,举一些例子! (1)进销存系统 想必 ...

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

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

  3. SpringBoot Zxing _ Java 生成二维码(可内嵌图片)

    前提 jdk 要求:1.8:会 SpringBoot.Maven: 以下代码可以直接复制粘贴到项目中,可以直接使用~ 一.pom 准备 <?xml version="1.0" ...

  4. Java 生成二维码 zxing生成二维码 条形码 服务端生成二维码 Java生成条形码

    Java 生成二维码 zxing生成二维码 条形码 服务端生成二维码 Java生成条形码 一.关于ZXing 1.ZXing是谷歌开源的支持二维码.条形码 等图形的生成类库:支持生成.和解码功能. G ...

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

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

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

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

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

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

  8. Java生成二维码带LOGO底部标题竖版字体

    前言 Java后端生成二维码 底部 侧面带有标题,可调节字号 参考文章 使用Java生成二维码图片(亲测) Reborn_YY使用Java生成二维码图片 图标素材库 Java后台生成图片,前台实现图片 ...

  9. java生成二维码,并在前端展示。

    java生成二维码,并在前端展示,扫码实现下载功能. 后端生成二维码以流的形式 前端接收二维码并展示 后端生成二维码以流的形式 这是以流的形式展示二维码.当然也可以以文件的格式,文件格式就是Path ...

最新文章

  1. OpenCV函数 Laplacian 算子实现
  2. C++基础-内存管理
  3. 如何用python开发游戏_手把手教你用Python完成一个控制台小游戏-阿里云开发者社区...
  4. 在C++中使用Lambda函数提高代码性能
  5. [swift 进阶]读书笔记-C2P3_Set、 C2P4_Range
  6. Oracle EBS二次开发简介
  7. 是你渡过人生难关的助力_人工智能将助力安全返回工作场所。 这是如何做
  8. 布朗大学计算机专业怎么样,Offer捷报 | 恭喜Z同学收获布朗大学计算机科学专业Offer!...
  9. c语言测试及答案,C语言测试题及答案解析
  10. 支持IE8的文件上传
  11. MYSQL建表语句转换成oracle建表语句
  12. 用cookie实现查看浏览记录
  13. 单片机 一键开关机 软件结合
  14. Flutter之常用组件的使用举例(中)
  15. 成都拓嘉启远:如何排查拼多多星级下降的原因
  16. 第二单元 用python学习微积分(十三)牛顿迭代法、中值定理和重要不等式
  17. 电锤、冲击钻和空心钻的使用方法
  18. ACM题库以及培养策略
  19. Linux鸟哥的私房菜(硬件)
  20. 计算机专业英语词组,(计算机专业英语词组.doc

热门文章

  1. 【C++初阶11-模版进阶】解锁C++模版更多玩法
  2. php结束代码,php语句以什么符号结束
  3. 【我们的故事】---做彩信SP同学的故事
  4. thinkphp源码没问题却各种报错,Namespace declaration statement has to be the very first statement in the script
  5. Qt之系统托盘你学清楚了吗?
  6. kail更新火狐浏览器firefox
  7. sentinel教程
  8. 融信中国见顶?欧宗洪的最后一搏
  9. 用Python代码实现走迷宫算法
  10. html中嵌套iframe页面