java使用Qrcode生成二维码(内嵌logo)

1、前言

整理一个使用qrcode.jar生成二维码的测试方法,以备后面学习使用。

2、使用准备

Qrcode.jar

3、demo

    /*
        生成二维码
    */
    @RequestMapping(value="/creatQrcode", method = RequestMethod.POST)
    @ResponseBody
    public Object createQr(String content, HttpServletRequest request){
        Map<String, Object> map = new HashMap<String, Object>(5);
        try {
            Qrcode qrcode = new Qrcode();
            //设置排错率(H L M Q)
            qrcode.setQrcodeErrorCorrect('M');
            //N:数字  A:a-Z B:其他字符
            qrcode.setQrcodeEncodeMode('B');
            //设置版本(版本至49)
            qrcode.setQrcodeVersion(7);
            // 公式 67+12*(版本号-1)
            int width = 67 + 12*(7-1);
            int height = 67 + 12*(7-1);

            //定义图片缓冲区(指定图片缓冲区宽和高,以及类型)
            BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);

            //定义画板
            Graphics2D graphics = bufferedImage.createGraphics();
            graphics.setBackground(Color.WHITE);
            graphics.setColor(Color.BLACK);
            //初始化,并指定画板的宽和高
            graphics.clearRect(0, 0, width, height);

            //定义偏移量
            int pixoff = 2;
            //要绘制的内容(字节数组)
            byte[] contentBytes = content.getBytes("utf-8");
            //开始绘制:内容长度默认为124(超过124会报错)
            if (contentBytes.length > 0 && contentBytes.length < 120) {
                boolean[][] qr = qrcode.calQrcode(contentBytes);
                for (int i = 0; i < qr.length; i++) {
                    for (int j = 0; j < qr.length; j++) {
                        if (qr[j][i]) {
                            graphics.fillRect(j*3+pixoff, i * 3 + pixoff, 3, 3);
                        }
                    }
                }
            }

            //生成logo
            Image img = ImageIO.read(new File(request.getSession().getServletContext().getRealPath("/") + "/img/logo.jpg"));  // 实例化一个Image对象。
            graphics.drawImage(img, (width-30)/2, (height-30)/2, 30, 30, null);       // 75,75是距离gs两个边的距离,50,50是中间logo的大小

            //收起画板
            graphics.dispose();
            bufferedImage.flush();
            //将图片写入文件
            //ImageIO.write(bufferedImage, "jpg", new File("D:/20161010/qrcode/qrcode.jpg"));       --写到文件中
            //ImageIO.write(bufferedImage, "jpg", response.getOutputStream());      -- 使用原始的servlet,直接返回给请求的地方

            //字节数组流
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            //图片输出流
            ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(baos);

            //将图片写入图片流
            ImageIO.write(bufferedImage, "jpg", imageOutputStream);
            //将图片转化成base64,web显示
            String base64 = Base64.encode(baos.toByteArray());
            map.put("success", true);
            map.put("imageBase64", base64);
        } catch (Exception e) {
            e.printStackTrace();
            map.put("success", false);
        }
        return map;
    }

4、效果
这里写图片描述

猜你喜欢

转载自blog.csdn.net/static_coder/article/details/78972800
今日推荐