From 067c0578d6246d6588d500cc362f1bba9015d9f4 Mon Sep 17 00:00:00 2001 From: Looly Date: Sat, 11 Jan 2020 10:02:10 +0800 Subject: [PATCH] qrcode support argb --- CHANGELOG.md | 1 + .../cn/hutool/extra/qrcode/QrCodeUtil.java | 39 ++++++++++--------- .../java/cn/hutool/extra/qrcode/QrConfig.java | 39 ++++++++++++++++++- .../hutool/extra/qrcode/QrCodeUtilTest.java | 9 +++-- 4 files changed, 64 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index df653ceeb..b55e2881a 100644 --- a/CHANGELOG.md +++ b/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) diff --git a/hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrCodeUtil.java b/hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrCodeUtil.java index 0b2219603..73c5927fa 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrCodeUtil.java +++ b/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 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; diff --git a/hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrConfig.java b/hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrConfig.java index fc9078cbd..aee0ea647 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrConfig.java +++ b/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,12 +124,28 @@ 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; + } + /** * 获取背景色 * @@ -143,12 +160,30 @@ 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; + } + /** * 获取边距 * diff --git a/hutool-extra/src/test/java/cn/hutool/extra/qrcode/QrCodeUtilTest.java b/hutool-extra/src/test/java/cn/hutool/extra/qrcode/QrCodeUtilTest.java index 1aaf1ed08..cc32c3d8c 100644 --- a/hutool-extra/src/test/java/cn/hutool/extra/qrcode/QrCodeUtilTest.java +++ b/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