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

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

 

首先倒如zxing的依赖

       
            com.google.zxing
            core
            3.3.0
        

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

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 hints = new EnumMap(
		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生各种二维码,亲测好用,复制粘贴即可使用!_第1张图片

 

最后生成的二维码:

利用Zxing生各种二维码,亲测好用,复制粘贴即可使用!_第2张图片

你可能感兴趣的:(zxing,二维码,java,流,Javaweb,Java常用工具类)