优化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.NumberUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import com.google.zxing.*;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.GlobalHistogramBinarizer;
@ -46,12 +47,12 @@ public class QrCodeUtil {
*
* @param content 内容
* @param qrConfig 二维码配置包括长边距颜色等
* @param imageType 图片类型图片扩展名{@link ImgUtil}
* @param targetType 类型图片扩展名{@link #QR_TYPE_SVG} {@link #QR_TYPE_TXT}{@link ImgUtil}
* @param logoBase64 logo 图片的 base64 编码
* @return 图片 Base64 编码字符串
*/
public static String generateAsBase64(String content, QrConfig qrConfig, String imageType, String logoBase64) {
return generateAsBase64(content, qrConfig, imageType, Base64.decode(logoBase64));
public static String generateAsBase64(String content, QrConfig qrConfig, String targetType, String logoBase64) {
return generateAsBase64(content, qrConfig, targetType, Base64.decode(logoBase64));
}
/**
@ -59,12 +60,12 @@ public class QrCodeUtil {
*
* @param content 内容
* @param qrConfig 二维码配置包括长边距颜色等
* @param imageType 图片类型图片扩展名{@link ImgUtil}
* @param targetType 类型图片扩展名{@link #QR_TYPE_SVG} {@link #QR_TYPE_TXT}{@link ImgUtil}
* @param logo logo 图片的byte[]
* @return 图片 Base64 编码字符串
*/
public static String generateAsBase64(String content, QrConfig qrConfig, String imageType, byte[] logo) {
return generateAsBase64(content, qrConfig, imageType, ImgUtil.toImage(logo));
public static String generateAsBase64(String content, QrConfig qrConfig, String targetType, byte[] logo) {
return generateAsBase64(content, qrConfig, targetType, ImgUtil.toImage(logo));
}
/**
@ -72,13 +73,13 @@ public class QrCodeUtil {
*
* @param content 内容
* @param qrConfig 二维码配置包括长边距颜色等
* @param imageType 图片类型图片扩展名{@link ImgUtil}
* @param targetType 类型图片扩展名{@link #QR_TYPE_SVG} {@link #QR_TYPE_TXT}{@link ImgUtil}
* @param logo logo 图片的byte[]
* @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);
return generateAsBase64(content, qrConfig, imageType);
return generateAsBase64(content, qrConfig, targetType);
}
/**
@ -90,12 +91,36 @@ public class QrCodeUtil {
*
* @param content 内容
* @param qrConfig 二维码配置包括长边距颜色等
* @param imageType 图片类型图片扩展名{@link ImgUtil}
* @param targetType 类型图片扩展名{@link #QR_TYPE_SVG} {@link #QR_TYPE_TXT}{@link ImgUtil}
* @return 图片 Base64 编码字符串
*/
public static String generateAsBase64(String content, QrConfig qrConfig, String imageType) {
final BufferedImage img = generate(content, qrConfig);
return ImgUtil.toBase64DataUri(img, imageType);
public static String generateAsBase64(String content, QrConfig qrConfig, String targetType) {
String result;
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.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));
}
@ -87,6 +87,13 @@ public class QrCodeUtilTest {
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
@Ignore
public void decodeTest3() {