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

132 阅读1分钟

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、效果 这里写图片描述