前言:
需求描述:用户知道链接地址,但是不想点击链接,想通过扫码访问到指定网站;这时用户就只给我一个url地址,让我给他生成一个二维码!
对Zxing的了解: ZXing,一个支持在图像中解码和生成条形码(如二维码、PDF 417、EAN、UPC、Aztec、Data Matrix、Codabar)的库。ZXing(“zebra crossing”)是一个开源的、多格式的、用Java实现的一维/二维条码图像处理库,具有到其他语言的端口。
先看一下实现效果:
代码实现过程:
1.引入谷歌的zxing依赖
<!--引入生成二维码的依赖-->
<!-- https://mvnrepository.com/artifact/com.google.zxing/core -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.3.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.zxing/javase -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.3.0</version>
</dependency>
2.二维码生成工具类
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.OutputStream;
import java.util.Hashtable;
/**
* 二维码生成工具类
*/
public class QrCodeUtils {
private static final String CHARSET = "utf-8";
public static final String FORMAT = "JPG";
// 二维码尺寸
private static final int QRCODE_SIZE = 300;
/**
* 生成二维码
* @param content 二维码内容
* @return 图片
* @throws Exception
*/
public static BufferedImage createImage(String content) throws Exception {
// 二维码参数设置
Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
// 安全等级,最高h
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
// 编码设置
hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
// 设置margin=0-10
hints.put(EncodeHintType.MARGIN, 1);
// 创建矩阵容器
BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE,
hints);
int width = bitMatrix.getWidth();
int height = bitMatrix.getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 矩阵转换图像
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
}
}
return image;
}
/**
* 生成二维码
*
* @param content 内容
* @param output 输出流
* @throws Exception
*/
public static void encode(String content, OutputStream output)
throws Exception {
BufferedImage image = QrCodeUtils.createImage(content);
ImageIO.write(image, FORMAT, output);
}
}
3.控制层
import com.king.science.util.QrCodeUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
/**
* @author xf
* @version 1.0.0
* @ClassName QRCodeController
* @Description TODO 二维码生成
* @createTime 2020.10.21 14:47
*/
@Controller
public class QRCodeController {
/**
* 用户传urlPath,根据urlPath生成相应的二维码
* @param request
* @param response
*/
@GetMapping("/createQrCode")
public void createQrCode(HttpServletRequest request, HttpServletResponse response) {
String urlPath = request.getParameter("urlPath");
//String urlPath = "https://blog.csdn.net/weixin_44146379";
try {
OutputStream os = response.getOutputStream();
//requestUrl:需要生成二维码的连接,os:响应输出流
QrCodeUtils.encode(urlPath, os);
} catch (Exception e) {
e.printStackTrace();
}
}
}
4.访问定义的controller实现生成的 二维码: 5.测试:使用手机扫码
测试成功,可正常访问(我上面放的链接地址是我的博客地址)
总结:
二维码简单的实现就是如上过程,当然二维码还有很多优美样式操作(如:加Logo,加边框等等)如果大家感兴趣可百度查询,我上面实现的是一个简单的实现过程,感谢阅读