欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

利用Zxing生各种二维码,亲测好用,复制粘贴即可使用!

程序员文章站 2022-03-22 20:51:34
...

最近项目中需要生成二维码,并且是带logo的,那么今天在这里做个简单的记录

 

首先倒如zxing的依赖

       <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.3.0</version>
        </dependency>

然后大家直接拷贝我的工具类即可直接调用方法生成各种二维码哦,非常简单!

package org.springblade.modules.api.util;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.EnumMap;

/**
 * 生成二维码
 * 微信搜索:阿枫科技
 */
public class ZXingCodeEncodeUtils {
	// 设置相前的常量
	// 二维码颜色
	private static final int BLACK = 0xFF000000;
	// 二维码背景颜色
	private static final int WHITE = 0xFFFFFFFF;
	// 二维码格式参数
	private static final EnumMap<EncodeHintType, Object> hints = new EnumMap<EncodeHintType, Object>(
		EncodeHintType.class);

	static {
		/*
		 * 二维码的纠错级别(排错率),4个级别: L (7%)、 M (15%)、 Q (25%)、 H (30%)(最高H)
		 * 纠错信息同样存储在二维码中,纠错级别越高,纠错信息占用的空间越多,那么能存储的有用讯息就越少;共有四级; 选择M,扫描速度快。
		 */
		hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
		// 二维码边界空白大小 1,2,3,4 (4为默认,最大)
		hints.put(EncodeHintType.MARGIN, 1);
		hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
	}

	/**
	 * 生成一个普通的二维码保存到D盘
	 *
	 * @param text       二维码里面存放的内容
	 * @param width      二维的宽度
	 * @param height     二维码的高度
	 * @param outPutPath 输出路径 D:/laolei.gif
	 * @param imageType  image/gif
	 */
	public static void createZxingCodeNormal(String text, int width,
											 int height, String outPutPath, String imageType) {
		try {
			// 1、生成二维码
			BitMatrix encode = new MultiFormatWriter().encode(text,
				BarcodeFormat.QR_CODE, width, height, hints);
			// 2、获取二维码宽高
			int codeWidth = encode.getWidth();
			int codeHeight = encode.getHeight();
			// 3、将二维码放入缓冲流
			BufferedImage image = new BufferedImage(codeWidth, codeHeight,
				BufferedImage.TYPE_INT_RGB);
			for (int i = 0; i < codeWidth; i++) {
				for (int j = 0; j < codeHeight; j++) {
					// 4、循环将二维码内容定入图片
					image.setRGB(i, j, encode.get(i, j) ? BLACK : WHITE);
				}
			}
			File outPutImage = new File(outPutPath);
			// 如果图片不存在创建图片
			if (!outPutImage.exists()) {
				outPutImage.createNewFile();
			}
			// 5、将二维码写入图片
			ImageIO.write(image, imageType, outPutImage);
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("生成二维码图片失败");
		}
	}

	/**
	 * 生成一个普通的二维 返回一个图片流
	 *
	 * @param text   内容
	 * @param width  图片的宽度
	 * @param height 图片的高度
	 */
	public static BufferedImage createZxingCodeNormal(String text, int width,
													  int height) {
		BufferedImage bufferedImage = null;
		try {
			// 1、生成二维码
			BitMatrix encode = new MultiFormatWriter().encode(text,
				BarcodeFormat.QR_CODE, width, height, hints);
			// 2、获取二维码宽高
			int codeWidth = encode.getWidth();
			int codeHeight = encode.getHeight();
			// 3、将二维码放入缓冲流
			bufferedImage = new BufferedImage(codeWidth, codeHeight,
				BufferedImage.TYPE_INT_RGB);
			for (int i = 0; i < codeWidth; i++) {
				for (int j = 0; j < codeHeight; j++) {
					// 4、循环将二维码内容定入图片
					bufferedImage
						.setRGB(i, j, encode.get(i, j) ? BLACK : WHITE);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("生成二维码图片失败");
		}
		return bufferedImage;
	}

	/**
	 * 生成一个带logo的二维码 返回一个图片流 原理:先生成一个不带logo的二维码 再向这个二维码里面的中间添加logo的流
	 *
	 * @param text       内容
	 * @param width      图片的宽度
	 * @param height     图片的高度
	 * @param logoStream 指中间的logo的流
	 */
	public static BufferedImage createZxingCodeLogo(String text, int width,
													int height, InputStream logoStream) {
		// 1,生成普通的二维码
		BufferedImage image = createZxingCodeNormal(text, width, height);
		if (image == null) {
			System.out.println("二维码生成失败");
			return null;
		}
		// 2,把logoStream写到bufferedImage里面
		try {
			// 获取画笔
			Graphics2D g = image.createGraphics();
			if (logoStream == null) {
				System.out.println("logo的流为空");
				return image;
			} else {
				// 读取logo图片
				BufferedImage logo = ImageIO.read(logoStream);
				// 设置二维码大小,太大,会覆盖二维码,此处20%
				// 如是logn的宽度和高度大于二维码除以5之后的宽度和高就就使用二维码除以5之后的值作为logo的宽高
				int logoWidth = logo.getWidth(null) > image.getWidth() / 5 ? (image
					.getWidth() / 5) : logo.getWidth(null);
				int logoHeight = logo.getHeight(null) > image.getHeight() / 5 ? (image
					.getHeight() / 5) : logo.getHeight(null);
				// 设置logo图片放置位置
				// long的开始坐标
				int x = (image.getWidth() - logoWidth) / 2;
				int y = (image.getHeight() - logoHeight) / 2;
				// 开始合并绘制图片
				g.drawImage(logo, x, y, logoWidth, logoHeight, null);
				// 画一个圆角的矩形
				g.drawRoundRect(x, y, logoWidth, logoHeight, 15, 15);
				// logo边框大小
				g.setStroke(new BasicStroke(2));
				// logo边框颜色
				g.setColor(Color.WHITE);
				g.drawRect(x, y, logoWidth, logoHeight);
				g.dispose();
				logo.flush();
				image.flush();
			}
		} catch (Exception e) {
			System.out.println("二维码绘制logo失败");
		}
		return image;

	}

	public static void main(String[] args) throws IOException {
		/**在"D://图片下生成一个普通二维码*/
//		 createZxingCodeNormal("123", 400, 400, "D://图片//枫22.gif", "gif");

		/**在D:/下生成带流的普通二维码*/
//		  BufferedImage normal = createZxingCodeNormal("hhhhhhhhh", 200, 200);
//		 **设置二维码生成的地址*//*
//			File file = new File("D:/xf3.gif");
//			file.createNewFile();
//			ImageIO.write(normal, "gif", new FileOutputStream(file));

		/*******************************设置带logo的二维码******************************************************//*
		/** 导入要设置为logo的图片 */
		InputStream logoStream = new FileInputStream("D:\\截图\\a.png");
//		 设置二维码内容,大小,并把logo放入二维码
		BufferedImage bufferedImage = createZxingCodeLogo("小天才", 400, 400,
			logoStream);
		//**设置二维码生成的地址*//*
		File file = new File("D:/xf2.gif");
		file.createNewFile();
		ImageIO.write(bufferedImage, "gif", new FileOutputStream(file));
	}

}

如下:

logo为:利用Zxing生各种二维码,亲测好用,复制粘贴即可使用!

 

最后生成的二维码:

利用Zxing生各种二维码,亲测好用,复制粘贴即可使用!