java生成二维码

发布于:2024-04-11 ⋅ 阅读:(169) ⋅ 点赞:(0)

   /**
    * 生成二维码图片
    */
    @RequestMapping(value = "/markQRCode")
    public String markQRCode(Integer userId, HttpServletRequest request, Model model){
        User user = userService.queryById(userId);
        if(StringUtils.isEmpty(user.getQrCode())){
            String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + PropertyUtil.getProperty("basePath") + "/" + "d_sys_user";
            // 组装文件存储路径(图片保存至服务器端)
            Map<String, String> map = SpringContextHolder.getBean("fileDir");
            String baseDir = map.get("baseDir");
            String uploadRealRath = baseDir + File.separator + "d_sys_user";
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            String dateStr = sdf.format(new Date());
            String filePath = uploadRealRath + File.separator + dateStr + File.separator + "code";
            String image = user.getUserId() + ".png";
            String qrCode = basePath + "/" + dateStr + "/" + "code" + "/" + image;
            String file = filePath + File.separator + image;
            FileUtils.createDirectory(filePath);
            String ermPath =  request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()+"/user/queryAppDetail?userId="+user.getUserId();
            QrCode.generateQRCode(ermPath, 10, file);
            user.setQrCode(qrCode);
            user.setModifiedStaffId(this.getCurrentStaffId());
            user.setModifiedTime(DateUtil.format(new Date(), DateUtil.DATE_FORMAT));
            userService.updateData(user);
            model.addAttribute("qrCode", qrCode);
        }else{
            model.addAttribute("qrCode", user.getQrCode());
        }
        return PathUtil.FRONT_PATH+"user/user_browse";
    }
    
    public static boolean createDirectory(String descDirName) {
        String descDirNames = descDirName;
        if (!descDirNames.endsWith(File.separator)) {
            descDirNames = descDirNames + File.separator;
        }
        File descDir = new File(descDirNames);
        if (descDir.exists()) {
            log.debug("目录 " + descDirNames + " 已存在!");
            return false;
        }
        // 创建目录
        if (descDir.mkdirs()) {
            log.debug("目录 " + descDirNames + " 创建成功!");
            return true;
        } else {
            log.debug("目录 " + descDirNames + " 创建失败!");
            return false;
        }

    }


     */
    public static String generateQRCode(String qrData, int size, String imgPath,HttpServletRequest request){
        try {
            Qrcode qrcodeHandler = new Qrcode();
            // 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小
            qrcodeHandler.setQrcodeErrorCorrect('H');
            qrcodeHandler.setQrcodeEncodeMode('B');
            // 设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大
            qrcodeHandler.setQrcodeVersion(size);
            int imgSize = 67 + 12 * (size - 1);
//            byte[] contentBytes = content.getBytes("UTF-8");
            BufferedImage bufImg = new BufferedImage(imgSize, imgSize,
            BufferedImage.TYPE_INT_RGB);
            Graphics2D gs = bufImg.createGraphics();
            gs.setBackground(Color.WHITE);
            gs.clearRect(0, 0, imgSize, imgSize);
            // 设定图像颜色> BLACK
            gs.setColor(Color.BLACK);
            // 设置偏移量 不设置可能导致解析出错
            int pixoff = 2;
            // 输出内容> 二维码
//            if (contentBytes.length > 0 && contentBytes.length < 800) {
//                boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);
//                for (int i = 0; i < codeOut.length; i++) {
//                    for (int j = 0; j < codeOut.length; j++) {
//                        if (codeOut[j][i]) {
//                            gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
//                        }
//                    }
//                }
//            } else {
//                System.err.println("QRCode content bytes length = "
//                + contentBytes.length + " not in [ 0,120 ]. ");
//            }
            byte[] d = qrData.getBytes("UTF-8");
               if(d.length > 0 && d.length <120){
                   boolean[][] s = qrcodeHandler.calQrcode(d);
                   for(int i=0;i<s.length;i++){
                       for(int j=0;j<s.length;j++){
                           if(s[j][i]){
                               gs.fillRect(j*3+pixoff, i*3+pixoff, 3, 3);
                           }
                       }
                   }
               }
               //中间插入logo
            int width_4 = imgSize / 4;  
            int width_8 = width_4 / 2;  
            int height_4 = imgSize / 4;  
            int height_8 = height_4 / 2;  
            String logoPath = request.getSession().getServletContext().getRealPath("resources")+File.separator+"images"+File.separator+"wx_logo.png";
            //String logoPath = imgPath;
            Image img = ImageIO.read(new File(logoPath));
            //gs.drawImage(img, (imgSize-30)/2, (imgSize-30)/2, 30, 30, null); 
            gs.drawImage(img, width_4 + width_8, height_4 + height_8,width_4,height_4, null);     
             //插入logo结束 
               
            gs.dispose();
            bufImg.flush();
            File imgFile = new File(imgPath);
            // 生成二维码QRCode图片
            ImageIO.write(bufImg, "png", imgFile);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return imgPath;
    }


网站公告

今日签到

点亮在社区的每一天
去签到