使用Zxing生成二维码

4,751 阅读2分钟

前言:

需求描述:用户知道链接地址,但是不想点击链接,想通过扫码访问到指定网站;这时用户就只给我一个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,加边框等等)如果大家感兴趣可百度查询,我上面实现的是一个简单的实现过程,感谢阅读