优化QrCodeUtil生成base64方法,支持svg、txt

This commit is contained in:
TomXin 2022-08-22 11:03:17 +08:00
parent ea06be85e9
commit 87319eb73f
2 changed files with 46 additions and 14 deletions

View File

@ -11,6 +11,7 @@ import cn.hutool.core.lang.ansi.AnsiEncoder;
import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import com.google.zxing.*; import com.google.zxing.*;
import com.google.zxing.common.BitMatrix; import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.GlobalHistogramBinarizer; import com.google.zxing.common.GlobalHistogramBinarizer;
@ -46,12 +47,12 @@ public class QrCodeUtil {
* *
* @param content 内容 * @param content 内容
* @param qrConfig 二维码配置包括长边距颜色等 * @param qrConfig 二维码配置包括长边距颜色等
* @param imageType 图片类型图片扩展名{@link ImgUtil} * @param targetType 类型图片扩展名{@link #QR_TYPE_SVG} {@link #QR_TYPE_TXT}{@link ImgUtil}
* @param logoBase64 logo 图片的 base64 编码 * @param logoBase64 logo 图片的 base64 编码
* @return 图片 Base64 编码字符串 * @return 图片 Base64 编码字符串
*/ */
public static String generateAsBase64(String content, QrConfig qrConfig, String imageType, String logoBase64) { public static String generateAsBase64(String content, QrConfig qrConfig, String targetType, String logoBase64) {
return generateAsBase64(content, qrConfig, imageType, Base64.decode(logoBase64)); return generateAsBase64(content, qrConfig, targetType, Base64.decode(logoBase64));
} }
/** /**
@ -59,12 +60,12 @@ public class QrCodeUtil {
* *
* @param content 内容 * @param content 内容
* @param qrConfig 二维码配置包括长边距颜色等 * @param qrConfig 二维码配置包括长边距颜色等
* @param imageType 图片类型图片扩展名{@link ImgUtil} * @param targetType 类型图片扩展名{@link #QR_TYPE_SVG} {@link #QR_TYPE_TXT}{@link ImgUtil}
* @param logo logo 图片的byte[] * @param logo logo 图片的byte[]
* @return 图片 Base64 编码字符串 * @return 图片 Base64 编码字符串
*/ */
public static String generateAsBase64(String content, QrConfig qrConfig, String imageType, byte[] logo) { public static String generateAsBase64(String content, QrConfig qrConfig, String targetType, byte[] logo) {
return generateAsBase64(content, qrConfig, imageType, ImgUtil.toImage(logo)); return generateAsBase64(content, qrConfig, targetType, ImgUtil.toImage(logo));
} }
/** /**
@ -72,13 +73,13 @@ public class QrCodeUtil {
* *
* @param content 内容 * @param content 内容
* @param qrConfig 二维码配置包括长边距颜色等 * @param qrConfig 二维码配置包括长边距颜色等
* @param imageType 图片类型图片扩展名{@link ImgUtil} * @param targetType 类型图片扩展名{@link #QR_TYPE_SVG} {@link #QR_TYPE_TXT}{@link ImgUtil}
* @param logo logo 图片的byte[] * @param logo logo 图片的byte[]
* @return 图片 Base64 编码字符串 * @return 图片 Base64 编码字符串
*/ */
public static String generateAsBase64(String content, QrConfig qrConfig, String imageType, Image logo) { public static String generateAsBase64(String content, QrConfig qrConfig, String targetType, Image logo) {
qrConfig.setImg(logo); qrConfig.setImg(logo);
return generateAsBase64(content, qrConfig, imageType); return generateAsBase64(content, qrConfig, targetType);
} }
/** /**
@ -90,12 +91,36 @@ public class QrCodeUtil {
* *
* @param content 内容 * @param content 内容
* @param qrConfig 二维码配置包括长边距颜色等 * @param qrConfig 二维码配置包括长边距颜色等
* @param imageType 图片类型图片扩展名{@link ImgUtil} * @param targetType 类型图片扩展名{@link #QR_TYPE_SVG} {@link #QR_TYPE_TXT}{@link ImgUtil}
* @return 图片 Base64 编码字符串 * @return 图片 Base64 编码字符串
*/ */
public static String generateAsBase64(String content, QrConfig qrConfig, String imageType) { public static String generateAsBase64(String content, QrConfig qrConfig, String targetType) {
final BufferedImage img = generate(content, qrConfig); String result;
return ImgUtil.toBase64DataUri(img, imageType); switch (targetType) {
case QR_TYPE_SVG:
String svg = generateAsSvg(content, qrConfig);
result = svgToBase64(svg);
break;
case QR_TYPE_TXT:
String txt = generateAsAsciiArt(content, qrConfig);
result = txtToBase64(txt);
break;
default:
final BufferedImage img = generate(content, qrConfig);
result = ImgUtil.toBase64DataUri(img, targetType);
break;
}
return result;
}
private static String txtToBase64(String txt) {
return URLUtil.getDataUri("text/plain", "base64", Base64.encode(txt));
}
private static String svgToBase64(String svg) {
return URLUtil.getDataUri("image/svg+xml", "base64", Base64.encode(svg));
} }
/** /**

View File

@ -41,7 +41,7 @@ public class QrCodeUtilTest {
// 背景色透明 // 背景色透明
config.setBackColor(null); config.setBackColor(null);
config.setErrorCorrection(ErrorCorrectionLevel.H); config.setErrorCorrection(ErrorCorrectionLevel.H);
String path = FileUtil.isWindows() ? "d:/test/qrcodeCustom.txt" : "~/Desktop/hutool/qrcodeCustom.svg"; String path = FileUtil.isWindows() ? "d:/test/qrcodeCustom.png" : "~/Desktop/hutool/qrcodeCustom.png";
QrCodeUtil.generate("https://hutool.cn/", config, FileUtil.touch(path)); QrCodeUtil.generate("https://hutool.cn/", config, FileUtil.touch(path));
} }
@ -87,6 +87,13 @@ public class QrCodeUtilTest {
Assert.assertNotNull(base641); Assert.assertNotNull(base641);
} }
@Test
public void generateAsBase64Test3() {
String base64 = QrCodeUtil.generateAsBase64("https://hutool.cn/", new QrConfig(400, 400), "svg");
Assert.assertNotNull(base64);
System.out.println(base64);
}
@Test @Test
@Ignore @Ignore
public void decodeTest3() { public void decodeTest3() {