• 使用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("生成二维码失败");
            }
        }
    }
    
    
    
  • 相关阅读:
    Android ble 蓝牙4.0 总结
    Java byte数据类型详解
    Cocos2d-X在SwitchControl使用
    【翻译mos文章】Linux x86 and x86-64 系统SHMMAX最大
    poj 2478 Farey Sequence(欧拉函数是基于寻求筛法素数)
    Akka FSM 源代码分析
    HDU 4828 (卡特兰数+逆)
    [JSP][JSTL]页面调用函数--它${fn:}内置函数、是推断字符串是空的、更换车厢
    android 中国通信乱码问题
    Recall(检出率)和 Precision(准确性)
  • 原文地址:https://www.cnblogs.com/QullLee/p/10682746.html
Copyright © 2020-2023  润新知