系列文章目录
1.SpringBoot整合RabbitMQ并实现消息发送与接收
2. 解析JSON格式参数 & 修改对象的key
3. VUE整合Echarts实现简单的数据可视化
4. List<HashMap<String,String>>实现自定义字符串排序(key排序、Value排序)
5. Java实现发送邮件(定时自动发送邮件)
更多文章可看我主页哦~
文章目录
- 系列文章目录
- 前言
- 一、什么是二维码?
- 1.1 定义
- 1.2 理解
- 二、代码实现
- 2.1 引入依赖
- 2.2 编写工具类
- 2.3 编写Api
- 2.4 测试
- 三、扩展
- 总结
前言
在我们日常生活中,随处可见的二维码。在我们点餐时、购物时或是加好友时都会出现二维码,我们只需扫描二维码,就可以直接跳转到对应的小程序或者支付窗口。这是如何实现的呢?对我们软件、计算专业的同学来说,如何使用编程去实现二维码是非常必要的!!!
一、什么是二维码?
1.1 定义
二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的、黑白相间的、记录数据符号信息的图形;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化点。
1.2 理解
对于二维码,生成的过程是如定义里所说较为复杂,对我们开发人员来讲,如何能够使用代码实现二维码才是至关重要的。但在实现二维码之前先来想一下,二维码和什么相似? 对了,有同学肯定会想到:“链接”。它们一个是“扫”,一个是“点”的方式,均可以使我们直接跳转到对应的页面。
所以说大多数二维码里的内容,其实就是链接!。那么如何把通过JAVA代码把一个“http://xxx.com”的链接生成一个二维码图片并且扫描后可以跳转到对应的页面呢?这也是接下来我要带着大家一步步实现的!
二、代码实现
2.1 引入依赖
Maven 项目中添加对 ZXing(Zebra Crossing)二维码生成和解析库的依赖。在pom.xml添加依赖并刷新maven仓库加载依赖内容。
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.4.1</version> <!-- 或者更高版本 -->
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.4.1</version> <!-- 或者更高版本 -->
</dependency>
2.2 编写工具类
将公共方法封装起来,方法里有四个参数,分别代表的含义是:
- text:二维码的内容,一般是链接,也可以使文本。
- width:生成图片宽度
- height:生成图片高度
- filePath:图片存放路径
具体代码如下图所示:
package com.xintai.study.utils;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.*;
import java.awt.Graphics2D;
public class QRCodeGenerator {
/**
* 永久二维码
* @param text
* @param width
* @param height
* @param filePath
*/
public static void generateQRCodeImage(String text, int width, int height, String filePath) {
try {
QRCodeWriter qrCodeWriter = new QRCodeWriter();
Map<EncodeHintType, Object> hints = new HashMap<>();
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height, hints);
BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
bufferedImage.createGraphics();
Graphics2D graphics = (Graphics2D) bufferedImage.getGraphics();
graphics.setColor(java.awt.Color.WHITE);
graphics.fillRect(0, 0, width, height);
graphics.setColor(java.awt.Color.BLACK);
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
if (bitMatrix.get(i, j)) {
graphics.fillRect(i, j, 1, 1);
}
}
}
ImageIO.write(bufferedImage, "png", new File(filePath));
} catch (WriterException | IOException e) {
e.printStackTrace();
}
}
}
2.3 编写Api
为验证工具类方法是否能生成二维码,这里我简单编写了一个接口,传入具体的参数去调用工具类方法。查看是否可以生成对应的二维码文件。这里我实现的是扫描二维码进入百度的链接:“https://baidu.com”。
具体代码如下图所示:
package com.xintai.study.controller;
import com.xintai.study.common.R;
import com.xintai.study.utils.QRCodeGenerator;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
@Slf4j
@CrossOrigin
@RestController
@RequestMapping("/api/common")
public class CommonController {
@Value("${backend.Path}")
private String path;
@GetMapping("/QRCode")
public R<String> save(){
try {
String QR_CODE_IMAGE_PATH = path+"MyQRCode.png"; // 生成的二维码图片保存路径
String QR_CODE_TEXT = "https://baidu.com"; // 二维码内容,可以是URL等任意文本
QRCodeGenerator.generateQRCodeImage(QR_CODE_TEXT, 350, 350, QR_CODE_IMAGE_PATH);
return R.success("创建成功");
} catch (Exception e) {
log.error(e.toString());
return R.error("接口异常");
}
}
}
2.4 测试
使用postman去调用对应的接口,查看是否执行成功。如下图所示:在调用接口后提示创建成功,说明接口正常执行。
然后去到对应的文件夹下看是否生成对应的二维码图片,在我的文件夹下,已经生成对应的二维码效果图,并且扫描后可以正常跳转到百度。如下图所示:
大家也可以通过手机扫描上述二维码查看是否跳转到百度页面哦~
三、扩展
扩展部分是要自己去思考的,大家在日常生活中的二维码会发现都有时效性,在某个时间点过后就失效了。或者一个二维码只能被扫描一次的情况等等。这些都可以通过上述的依赖库方法进行实现,大家感兴趣可以自己查看依赖库中的方法,实现一个属于自己的小demo~
总结
使用JAVA代码已经实现二维码,对于现在的开发,有大多数的基础依赖库我们可以使用,也是体验站在巨人的肩膀上进行开发。将复杂的二维码生成过程缩减为现在的只需调用依赖库中的几个方法,甚至不需要过多的去理解二维码的生成原理。令我们的开发变得更加简单便捷!!!我也很希望优秀的大家能够有此想法,实现一个个人的maven依赖~