使用Google zxing生成二维码

添加Maven依赖

        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.2.1</version>
        </dependency>
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>javase</artifactId>
            <version>3.2.1</version>
        </dependency>

程序代码


/**
 * 二维码工具类
 * @Author kzh
 * @Description
 * @Date 19-4-1 下午4:50
 */
public class QrCodeUtils {

    private static final Logger log = LoggerFactory.getLogger(QrCodeUtils.class);

    /**
     * 创建二维码
     * @param content 二维码封装内容
     * @param logo 中心logo(未支持)
     * @param weight 宽度
     * @param height 高度
     * @return
     */
    public static BufferedImage createImage(String content, String logo, Integer weight, Integer height) {

        /**
         * 1、如果高度和宽度都有指定,使用指定的高宽
         * 2、如果高宽都未指定,使用默认的高宽300x300
         * 3、只指定了高宽中的一个,则高宽相等
         */
        if(weight != null && height != null) {

        }else if(weight == null && height == null) {
            weight = 300;
            height = 300;
        }else {
            weight = (weight == null ? height : weight);
            height = (height == null ? weight : height);
        }
        // 相关设置
        HashMap<EncodeHintType, Comparable> hints = new HashMap<>();
        // L(7%) M(15%) Q(25%) H(30%)
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
        // 二维码边界空白大小1,2,3,4,默认4,最大
        hints.put(EncodeHintType.MARGIN, 1);
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");

        try {
            QRCodeWriter writer = new QRCodeWriter();
            BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, weight, height, hints);
            BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix);
            return image;

        } catch (WriterException e) {
            log.error("生成二维码失败, 错误信息:{}", JSON.toJSONString(e));
            throw new RuntimeException("生成二维码失败");
        }
    }

    /**
     * 输出二维码到流中
     * 在本项目中输出到流中会出现换行,导致输出乱码,原因不详,建议使用base64输出形式{@link QrCodeUtils#writeToBase64(java.lang.String, java.lang.String, java.lang.Integer, java.lang.Integer)}
     * @param content
     * @param logo
     * @param stream
     * @param weight
     * @param height
     */
    public static void writeToStream(String content, String logo, OutputStream stream, Integer weight, Integer height) {
        try {
            BufferedImage image = createImage(content, logo, weight, height);
            // 输出图片为png格式
            ImageIO.write(image, "png", stream);
        } catch (IOException e) {
            log.error("生成二维码失败, 写入二维码到流失败,错误信息:{}", JSON.toJSONString(e));
            throw new RuntimeException( "生成二维码失败");
        }
    }

    /**
     * 以base64形式输出二维码
     * @param content
     * @param logo
     * @param weight
     * @param height
     * @return
     */
    public static String writeToBase64(String content, String logo, Integer weight, Integer height){
        try {
            BufferedImage image = createImage(content, logo, weight, height);
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            // 输出图片为png格式
            ImageIO.write(image, "png", bos);
            return "data:image/png;base64," + Base64.encode(bos.toByteArray());
        } catch (IOException e) {
            log.error("生成二维码失败, 二维码转base64失败,错误信息:{}", JSON.toJSONString(e));
            throw new RuntimeException("生成二维码失败");
        }
    }
}


posted @ 2019-04-10 12:40  程序员肥猫  阅读(631)  评论(0编辑  收藏  举报