利用zxing框架生成特色的二维码(带中间头像)

1. 目标

利用zxing框架生成特色的二维码,效果如下:
在这里插入图片描述

2. 开发步骤

2.1. 配置依赖jar包

<!-- 配置二维码生成的框架 -->
<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>javase</artifactId>
    <version>3.1.0</version>
</dependency>

2.2. 开发BarCodeController控制器

/**
 * 生成二维码控制器
 */
@Controller
public class BarCodeController {
    
    
	
	/** 定义二维码图片的宽度 */
	private static final int WIDTH = 200;
	/** 定义二维码图片的高度 */
	private static final int HEIGHT = 200;
	
	/** 定义LOGO图片的宽度 */
	private static final int LOGO_WIDTH = 50;
	/** 定义LOGO图片的高度 */
	private static final int LOGO_HEIGHT = 50;
	
	/** 生成二维码的方法 */
	@GetMapping("/barcode")
	public void execute(@RequestParam(value="url", required=false)String url,
				HttpServletResponse response) throws Exception{
    
    
		/** 判断二维码中URL */
		if (url == null || "".equals(url)){
    
    
			url = "http://www.itcast.cn";
		}
		
		/** 定义Map集合封装二维码配置信息 */
		Map<EncodeHintType, Object> hints = new HashMap<>();
		/** 设置二维码图片的内容编码 */
		hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
		/** 设置二维码图片的上、下、左、右间隙 */
		hints.put(EncodeHintType.MARGIN, 1);
		/** 设置二维码的纠错级别 */
		hints.put(EncodeHintType.ERROR_CORRECTION, 
ErrorCorrectionLevel.H);
		/** 
		 * 创建二维码字节转换对象
		 * 第一个参数:二维码图片中的内容
		 * 第二个参数:二维码格式器
		 * 第三个参数:生成二维码图片的宽度
		 * 第四个参数:生成二维码图片的高度
		 * 第五个参数:生成二维码需要配置信息
		 *  */
		BitMatrix matrix = new 
MultiFormatWriter().encode(url, 
				BarcodeFormat.QR_CODE, WIDTH, HEIGHT, hints);
		
		/** 获取二维码图片真正的宽度  */
		int matrix_width = matrix.getWidth();
		/** 获取二维码图片真正的高度  */
		int matrix_height = matrix.getHeight();
		/** 定义一张空白的缓冲流图片 */
		BufferedImage image = new 
BufferedImage(matrix_width, matrix_height,
					BufferedImage.TYPE_INT_RGB);
		/** 把二维码字节转换对象 转化 到缓冲流图片上 */
		for (int x = 0; x < matrix_width; x++){
    
    
			for (int y = 0; y < matrix_height; y++){
    
    
				/** 通过x、y坐标获取一点的颜色 true: 黑色  false: 白色 */
				int rgb = matrix.get(x, y) ? 0xFF1493 : 0xFFFFFF;
				image.setRGB(x, y, rgb);
			}
		}
		
		/** 获取公司logo图片 */
		BufferedImage logo = ImageIO.read(new File(
this.getClass().getResource("/logo.jpg").getPath()));
		/** 获取缓冲流图片的画笔 */
		Graphics2D g = (Graphics2D)image.getGraphics();
		/** 在二维码图片中间绘制公司logo */
		g.drawImage(logo, (matrix_width - LOGO_WIDTH) / 2, 
						  (matrix_height - LOGO_HEIGHT) / 2,
             LOGO_WIDTH, LOGO_HEIGHT, null);
		
		/** 设置画笔的颜色 */
		g.setColor(Color.WHITE);
		/** 设置画笔的粗细 */
		g.setStroke(new BasicStroke(5.0f));
		/** 设置消除锯齿 */
		g.setRenderingHint(RenderingHints
.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		/** 绘制圆角矩形 */
		g.drawRoundRect((matrix_width - LOGO_WIDTH) / 2, 
(matrix_height - LOGO_HEIGHT) / 2,
LOGO_WIDTH, LOGO_HEIGHT, 10, 10);
		
		/** 向浏览器输出二维码 */
		ImageIO.write(image, "png", 
response.getOutputStream());
	}
}

2.3. 提供html页面

<!DOCTYPE html>
<html>
	<head>
		<title>二维码</title>
		<meta charset="UTF-8"/>
		<meta http-equiv="pragma" content="no-cache"/>
		<style type="text/css">
			body{
     
     
				background-color : black;
			}
		</style>
	</head>
	<body>
		<img alt="二维码" 
src="barcode?url=https://www.baidu.com" 
			width="200" height="200"/>
	</body>
</html>
	

猜你喜欢

转载自blog.csdn.net/qq_45850872/article/details/112347236