Browse Source

qrcode support argb

Looly 6 years ago
parent
commit
067c0578d6

+ 1 - 0
CHANGELOG.md

@@ -15,6 +15,7 @@
 * 【core  】    提供一个自带默认值的Map(pr#87@Gitee)
 * 【core  】    修改Dict在非大小写敏感状态下get也不区分大小写(issue#722@Github)
 * 【core  】    StrUtil增加contains方法(issue#716@Github)
+* 【core  】    QrCodeUtil增加背景透明支持(pr#89@Gitee)
 
 ### Bug修复
 * 【core 】     修复NumberUtil.mul中null的结果错误问题(issue#I17Y4J@Gitee)

+ 21 - 18
hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrCodeUtil.java

@@ -1,14 +1,8 @@
 package cn.hutool.extra.qrcode;
 
-import java.awt.Image;
-import java.awt.Rectangle;
-import java.awt.image.BufferedImage;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.HashMap;
-
+import cn.hutool.core.img.Img;
+import cn.hutool.core.img.ImgUtil;
+import cn.hutool.core.util.CharsetUtil;
 import com.google.zxing.BarcodeFormat;
 import com.google.zxing.Binarizer;
 import com.google.zxing.BinaryBitmap;
@@ -22,9 +16,14 @@ import com.google.zxing.WriterException;
 import com.google.zxing.common.BitMatrix;
 import com.google.zxing.common.HybridBinarizer;
 
-import cn.hutool.core.img.Img;
-import cn.hutool.core.img.ImgUtil;
-import cn.hutool.core.util.CharsetUtil;
+import java.awt.Image;
+import java.awt.Rectangle;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.HashMap;
 
 /**
  * 基于Zxing的二维码工具类
@@ -310,9 +309,9 @@ public class QrCodeUtil {
 		final HashMap<DecodeHintType, Object> hints = new HashMap<>();
 		hints.put(DecodeHintType.CHARACTER_SET, CharsetUtil.UTF_8);
 		// 优化精度
-		hints.put(DecodeHintType.TRY_HARDER, Boolean.valueOf(isTryHarder));
+		hints.put(DecodeHintType.TRY_HARDER, isTryHarder);
 		// 复杂模式,开启PURE_BARCODE模式
-		hints.put(DecodeHintType.PURE_BARCODE, Boolean.valueOf(isPureBarcode));
+		hints.put(DecodeHintType.PURE_BARCODE, isPureBarcode);
 		Result result;
 		try {
 			result = formatReader.decode(binaryBitmap, hints);
@@ -334,17 +333,21 @@ public class QrCodeUtil {
 	 * 
 	 * @param matrix BitMatrix
 	 * @param foreColor 前景色
-	 * @param backColor 背景色
+	 * @param backColor 背景色(null表示透明背景)
 	 * @return BufferedImage
 	 * @since 4.1.2
 	 */
-	public static BufferedImage toImage(BitMatrix matrix, int foreColor, int backColor) {
+	public static BufferedImage toImage(BitMatrix matrix, int foreColor, Integer backColor) {
 		final int width = matrix.getWidth();
 		final int height = matrix.getHeight();
-		BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+		BufferedImage image = new BufferedImage(width, height, null == backColor ? BufferedImage.TYPE_INT_ARGB : BufferedImage.TYPE_INT_RGB);
 		for (int x = 0; x < width; x++) {
 			for (int y = 0; y < height; y++) {
-				image.setRGB(x, y, matrix.get(x, y) ? foreColor : backColor);
+				if(matrix.get(x, y)) {
+					image.setRGB(x, y, foreColor);
+				} else if(null != backColor){
+					image.setRGB(x, y, backColor);
+				}
 			}
 		}
 		return image;

+ 37 - 2
hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrConfig.java

@@ -1,5 +1,6 @@
 package cn.hutool.extra.qrcode;
 
+import java.awt.Color;
 import java.awt.Image;
 import java.io.File;
 import java.nio.charset.Charset;
@@ -29,8 +30,8 @@ public class QrConfig {
 	protected int height;
 	/** 前景色(二维码颜色) */
 	protected int foreColor = BLACK;
-	/** 背景色 */
-	protected int backColor = WHITE;
+	/** 背景色,默认白色,null表示透明 */
+	protected Integer backColor = WHITE;
 	/** 边距1~4 */
 	protected Integer margin = 2;
 	/** 纠错级别 */
@@ -123,13 +124,29 @@ public class QrConfig {
 	 * 
 	 * @param foreColor 前景色
 	 * @return this
+	 * @deprecated 请使用 {@link #setForeColor(Color)}
 	 */
+	@Deprecated
 	public QrConfig setForeColor(int foreColor) {
 		this.foreColor = foreColor;
 		return this;
 	}
 
 	/**
+	 * 设置前景色,例如:Color.BLUE.getRGB()
+	 *
+	 * @param foreColor 前景色
+	 * @return this
+	 * @since 5.1.1
+	 */
+	public QrConfig setForeColor(Color foreColor) {
+		if(null != foreColor){
+			this.foreColor = foreColor.getRGB();
+		}
+		return this;
+	}
+
+	/**
 	 * 获取背景色
 	 * 
 	 * @return 背景色
@@ -143,13 +160,31 @@ public class QrConfig {
 	 * 
 	 * @param backColor 背景色
 	 * @return this
+	 * @deprecated 请使用 {@link #setBackColor(Color)}
 	 */
+	@Deprecated
 	public QrConfig setBackColor(int backColor) {
 		this.backColor = backColor;
 		return this;
 	}
 
 	/**
+	 * 设置背景色,例如:Color.BLUE
+	 *
+	 * @param backColor 背景色,null表示透明背景
+	 * @return this
+	 * @since 5.1.1
+	 */
+	public QrConfig setBackColor(Color backColor) {
+		if(null == backColor){
+			this.backColor = null;
+		} else {
+			this.backColor = backColor.getRGB();
+		}
+		return this;
+	}
+
+	/**
 	 * 获取边距
 	 * 
 	 * @return 边距

+ 5 - 4
hutool-extra/src/test/java/cn/hutool/extra/qrcode/QrCodeUtilTest.java

@@ -28,11 +28,12 @@ public class QrCodeUtilTest {
 	@Ignore
 	public void generateCustomTest() {
 		QrConfig config = new QrConfig();
-		config.setMargin(3);
-		config.setForeColor(Color.CYAN.getRGB());
-		config.setBackColor(Color.GRAY.getRGB());
+		config.setMargin(0);
+		config.setForeColor(Color.CYAN);
+		// 背景色透明
+		config.setBackColor(null);
 		config.setErrorCorrection(ErrorCorrectionLevel.H);
-		QrCodeUtil.generate("https://hutool.cn/", config, FileUtil.file("e:/qrcodeCustom.jpg"));
+		QrCodeUtil.generate("https://hutool.cn/", config, FileUtil.file("d:/qrcodeCustom.png"));
 	}
 
 	@Test