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 0ce5dccd8..9380cc8c2 100755 --- a/hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrConfig.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrConfig.java @@ -30,7 +30,7 @@ public class QrConfig { /** 高度 */ protected int height; /** 前景色(二维码颜色) */ - protected int foreColor = BLACK; + protected Integer foreColor = BLACK; /** 背景色,默认白色,null表示透明 */ protected Integer backColor = WHITE; /** 边距0~4 */ @@ -134,7 +134,9 @@ public class QrConfig { * @since 5.1.1 */ public QrConfig setForeColor(final Color foreColor) { - if(null != foreColor){ + if(null == foreColor){ + this.foreColor = null; + } else { this.foreColor = foreColor.getRGB(); } return this; diff --git a/hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrSVG.java b/hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrSVG.java new file mode 100644 index 000000000..ae5a90b59 --- /dev/null +++ b/hutool-extra/src/main/java/cn/hutool/extra/qrcode/QrSVG.java @@ -0,0 +1,85 @@ +package cn.hutool.extra.qrcode; + +import cn.hutool.core.text.StrUtil; +import cn.hutool.swing.img.ImgUtil; +import com.google.zxing.common.BitMatrix; + +import java.awt.Color; +import java.awt.Image; + +/** + * 二维码的SVG表示 + * + * @author Tom Xin + */ +public class QrSVG { + + private final BitMatrix matrix; + private final QrConfig qrConfig; + + public QrSVG(BitMatrix matrix, QrConfig qrConfig) { + this.matrix = matrix; + this.qrConfig = qrConfig; + } + + @Override + public String toString() { + final Image logoImg = qrConfig.img; + final Integer foreColor = qrConfig.foreColor; + final Integer backColor = qrConfig.backColor; + final int ratio = qrConfig.ratio; + + final StringBuilder sb = new StringBuilder(); + int qrWidth = matrix.getWidth(); + int qrHeight = matrix.getHeight(); + int moduleHeight = (qrHeight == 1) ? qrWidth / 2 : 1; + for (int y = 0; y < qrHeight; y++) { + for (int x = 0; x < qrWidth; x++) { + if (matrix.get(x, y)) { + sb.append(" M").append(x).append(",").append(y).append("h1v").append(moduleHeight).append("h-1z"); + } + } + } + qrHeight *= moduleHeight; + String logoBase64 = ""; + int logoWidth = 0; + int logoHeight = 0; + int logoX = 0; + int logoY = 0; + if (logoImg != null) { + logoBase64 = ImgUtil.toBase64DataUri(logoImg, "png"); + // 按照最短的边做比例缩放 + if (qrWidth < qrHeight) { + logoWidth = qrWidth / ratio; + logoHeight = logoImg.getHeight(null) * logoWidth / logoImg.getWidth(null); + } else { + logoHeight = qrHeight / ratio; + logoWidth = logoImg.getWidth(null) * logoHeight / logoImg.getHeight(null); + } + logoX = (qrWidth - logoWidth) / 2; + logoY = (qrHeight - logoHeight) / 2; + + } + + StringBuilder result = StrUtil.builder(); + result.append("\n"); + result.append(" \n"); + if (StrUtil.isNotBlank(logoBase64)) { + result.append("\n"); + } + result.append(""); + return result.toString(); + } +}