一、二维码介绍
二维码(2-Dimensional Bar Code),是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的。它是指在一维条码的基础上扩展出另一维具有可读性的条码,使用黑白矩形图案表示二进制数据,被设备扫描后可获取其中所包含的信息。一维条码的宽度记载着数据,而其长度没有记载数据。二维条码的长度、宽度均记载着数据。二维条码有一维条码没有的“定位点”和“容错机制”。容错机制在即使没有辨识到全部的条码、或是说条码有污损时,也可以正确地还原条码上的信息。
1.ZXing
一个支持在图像中解码和生成条形码(如二维码、PDF 417、EAN、UPC、Aztec、Data Matrix、Codabar)的库。ZXing(“zebra crossing”)是一个开源的、多格式的、用Java实现的一维/二维条码图像处理库,具有到其他语言的端口。
2.HuTool
hutool是一个封装了字符串、数字、日期、文件、加密、数据库、JSON、HTTP等多种操作的Java工具类库,旨在帮助开发者快速、便捷地完成各类开发任务。
二、代码实现
1.引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.5.7</version>
</dependency>
</dependencies>
2.QrcodeGenerator
package com.spella.utils;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.util.Base64;
public class QrcodeGenerator {
public static void generateQrcodeImage(String content,int width,int height,String filepath){
QRCodeWriter qrCodeWriter = new QRCodeWriter();
try {
BitMatrix encode = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, width, height);
Path path = FileSystems.getDefault().getPath(filepath);
MatrixToImageWriter.writeToPath(encode,"PNG",path);
} catch (WriterException | IOException e) {
throw new RuntimeException(e);
}
}
public static String writeToStream(String content, int width, int height) {
String message = "";
QRCodeWriter qrCodeWriter = new QRCodeWriter();
BitMatrix bitMatrix;
try {
bitMatrix = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, width, height);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
MatrixToImageWriter.writeToStream(bitMatrix, "PNG", outputStream);
Base64.Encoder encoder = Base64.getEncoder();
message = encoder.encodeToString(outputStream.toByteArray());
} catch (Exception e) {
e.printStackTrace();
}
return message;
}
}
3.ZxingController
package com.spella.controller;
import cn.hutool.core.io.FileUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import com.spella.utils.QrcodeGenerator;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.awt.*;
@RestController
public class ZxingController {
@GetMapping("/qrcode/image")
public String qrcodeImage(String number){
String filepath = "E:\\tmp\\" + number + ".png";
try {
//生成指定内容、宽、高的二维码图片,输出到filepath路径下
QrcodeGenerator.generateQrcodeImage("https://www.baidu.com", 350, 350, filepath);
} catch (Exception e) {
e.printStackTrace();
}
return filepath;
}
@GetMapping("/qrcode/base64")
public String qrcodeBase64(String content) {
String message = "";
try {
//根据输入的内容生成二维码图片返回base64编码
message = QrcodeGenerator.writeToStream(content, 350, 350);
} catch (Exception e) {
e.printStackTrace();
}
return message;
}
@GetMapping("/hutool/image1")
public String hutoolImage1() {
String message = "";
try {
//hutool工具生成
QrConfig config = new QrConfig(300, 300);
config.setMargin(3);
config.setForeColor(Color.CYAN.getRGB());
config.setBackColor(Color.GRAY.getRGB());
QrCodeUtil.generate("https://www.baidu.com/", config, FileUtil.file("E:\\tmp\\hutool.png"));
} catch (Exception e) {
e.printStackTrace();
}
return message;
}
@GetMapping("/hutool/image2")
public String hutoolImage2() {
String message = "";
try {
//hutool工具生成
QrCodeUtil.generate(//
"https://www.baidu.com/", //content
QrConfig.create().setImg("E:\\tmp\\logo.jpg"), //logo
FileUtil.file("E:\\tmp\\qrcodeWithLogo.jpg")//output file
);
} catch (Exception e) {
e.printStackTrace();
}
return message;
}
}
4.ApplicationZxing
@SpringBootApplication
public class ApplicationZxing {
public static void main(String[] args) {
SpringApplication.run(ApplicationZxing.class,args);
}
}
5.application.yml
spring:
application:
name: spring-qrcode-zxing
server:
port: 8080
三、测试
1.接口测试
http://localhost:8080/qrcode/image?number=1
http://localhost:8080/qrcode/base64?content=https://www.baidu.com
http://localhost:8080/hutool/image1
http://localhost:8080/hutool/image2