add methods

This commit is contained in:
Looly
2020-05-19 17:17:17 +08:00
parent a25b2afeef
commit 4b53701670
5 changed files with 170 additions and 93 deletions

View File

@@ -1,5 +1,6 @@
package cn.hutool.extra.qrcode;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.img.Img;
import cn.hutool.core.img.ImgUtil;
import cn.hutool.core.util.CharsetUtil;
@@ -19,24 +20,17 @@ import com.google.zxing.common.HybridBinarizer;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.MessageFormat;
import java.util.Base64;
import java.util.HashMap;
import javax.imageio.ImageIO;
/**
* 基于Zxing的二维码工具类
*
*
* @author looly
* @since 4.0.2
*
*/
public class QrCodeUtil {
@@ -50,13 +44,7 @@ public class QrCodeUtil {
* @return 图片 Base64 编码字符串
*/
public static String generateAsBase64(String content, QrConfig qrConfig, String imageType, String logoBase64) {
byte[] decode;
try {
decode = Base64.getDecoder().decode(logoBase64);
} catch (Exception e) {
throw new QrCodeException(e);
}
return generateAsBase64(content, qrConfig, imageType, decode);
return generateAsBase64(content, qrConfig, imageType, Base64.decode(logoBase64));
}
/**
@@ -69,36 +57,46 @@ public class QrCodeUtil {
* @return 图片 Base64 编码字符串
*/
public static String generateAsBase64(String content, QrConfig qrConfig, String imageType, byte[] logo) {
BufferedImage img;
try {
img = ImageIO.read(new ByteArrayInputStream(logo));
} catch (IOException e) {
throw new QrCodeException(e);
}
qrConfig.setImg(img);
return generateAsBase64(content, qrConfig, imageType, ImgUtil.toImage(logo));
}
/**
* 生成代 logo 图片的 Base64 编码格式的二维码,以 String 形式表示
*
* @param content 内容
* @param qrConfig 二维码配置,包括长、宽、边距、颜色等
* @param imageType 图片类型(图片扩展名),见{@link ImgUtil}
* @param logo logo 图片的byte[]
* @return 图片 Base64 编码字符串
*/
public static String generateAsBase64(String content, QrConfig qrConfig, String imageType, Image logo) {
qrConfig.setImg(logo);
return generateAsBase64(content, qrConfig, imageType);
}
/**
* 生成 Base64 编码格式的二维码,以 String 形式表示
*
* <p>
* 输出格式为: data:image/[type];base64,[data]
* </p>
*
* @param content 内容
* @param qrConfig 二维码配置,包括长、宽、边距、颜色等
* @param imageType 图片类型(图片扩展名),见{@link ImgUtil}
* @return 图片 Base64 编码字符串
*/
public static String generateAsBase64(String content, QrConfig qrConfig, String imageType) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
generate(content, qrConfig, imageType, bos);
byte[] encode = Base64.getEncoder().encode(bos.toByteArray());
return MessageFormat.format("data:image/{0};base64,{1}", imageType, new String(encode));
final BufferedImage img = generate(content, qrConfig);
return ImgUtil.toBase64DateUri(img, imageType);
}
/**
* 生成PNG格式的二维码图片以byte[]形式表示
*
* @param content 内容
* @param width 宽度
* @param height 高度
* @param width 宽度
* @param height 高度
* @return 图片的byte[]
* @since 4.0.10
*/
@@ -112,7 +110,7 @@ public class QrCodeUtil {
* 生成PNG格式的二维码图片以byte[]形式表示
*
* @param content 内容
* @param config 二维码配置,包括长、宽、边距、颜色等
* @param config 二维码配置,包括长、宽、边距、颜色等
* @return 图片的byte[]
* @since 4.1.2
*/
@@ -124,10 +122,10 @@ public class QrCodeUtil {
/**
* 生成二维码到文件,二维码图片格式取决于文件的扩展名
*
* @param content 文本内容
* @param width 宽度
* @param height 高度
*
* @param content 文本内容
* @param width 宽度
* @param height 高度
* @param targetFile 目标文件,扩展名决定输出格式
* @return 目标文件
*/
@@ -139,9 +137,9 @@ public class QrCodeUtil {
/**
* 生成二维码到文件,二维码图片格式取决于文件的扩展名
*
* @param content 文本内容
* @param config 二维码配置,包括长、宽、边距、颜色等
*
* @param content 文本内容
* @param config 二维码配置,包括长、宽、边距、颜色等
* @param targetFile 目标文件,扩展名决定输出格式
* @return 目标文件
* @since 4.1.2
@@ -154,12 +152,12 @@ public class QrCodeUtil {
/**
* 生成二维码到输出流
*
* @param content 文本内容
* @param width 宽度
* @param height 高度
*
* @param content 文本内容
* @param width 宽度
* @param height 高度
* @param imageType 图片类型(图片扩展名),见{@link ImgUtil}
* @param out 目标流
* @param out 目标流
*/
public static void generate(String content, int width, int height, String imageType, OutputStream out) {
final BufferedImage image = generate(content, width, height);
@@ -168,11 +166,11 @@ public class QrCodeUtil {
/**
* 生成二维码到输出流
*
* @param content 文本内容
* @param config 二维码配置,包括长、宽、边距、颜色等
*
* @param content 文本内容
* @param config 二维码配置,包括长、宽、边距、颜色等
* @param imageType 图片类型(图片扩展名),见{@link ImgUtil}
* @param out 目标流
* @param out 目标流
* @since 4.1.2
*/
public static void generate(String content, QrConfig config, String imageType, OutputStream out) {
@@ -182,10 +180,10 @@ public class QrCodeUtil {
/**
* 生成二维码图片
*
*
* @param content 文本内容
* @param width 宽度
* @param height 高度
* @param width 宽度
* @param height 高度
* @return 二维码图片(黑白)
*/
public static BufferedImage generate(String content, int width, int height) {
@@ -194,11 +192,11 @@ public class QrCodeUtil {
/**
* 生成二维码或条形码图片
*
*
* @param content 文本内容
* @param format 格式,可选二维码或者条形码
* @param width 宽度
* @param height 高度
* @param format 格式,可选二维码或者条形码
* @param width 宽度
* @param height 高度
* @return 二维码图片(黑白)
*/
public static BufferedImage generate(String content, BarcodeFormat format, int width, int height) {
@@ -207,9 +205,9 @@ public class QrCodeUtil {
/**
* 生成二维码图片
*
*
* @param content 文本内容
* @param config 二维码配置,包括长、宽、边距、颜色等
* @param config 二维码配置,包括长、宽、边距、颜色等
* @return 二维码图片(黑白)
* @since 4.1.2
*/
@@ -220,10 +218,10 @@ public class QrCodeUtil {
/**
* 生成二维码或条形码图片<br>
* 只有二维码时QrConfig中的图片才有效
*
*
* @param content 文本内容
* @param format 格式,可选二维码、条形码等
* @param config 二维码配置,包括长、宽、边距、颜色等
* @param format 格式,可选二维码、条形码等
* @param config 二维码配置,包括长、宽、边距、颜色等
* @return 二维码图片(黑白)
* @since 4.1.14
*/
@@ -256,12 +254,13 @@ public class QrCodeUtil {
}
// ------------------------------------------------------------------------------------------------------------------- encode
/**
* 将文本内容编码为二维码
*
*
* @param content 文本内容
* @param width 宽度
* @param height 高度
* @param width 宽度
* @param height 高度
* @return {@link BitMatrix}
*/
public static BitMatrix encode(String content, int width, int height) {
@@ -270,9 +269,9 @@ public class QrCodeUtil {
/**
* 将文本内容编码为二维码
*
*
* @param content 文本内容
* @param config 二维码配置,包括长、宽、边距、颜色等
* @param config 二维码配置,包括长、宽、边距、颜色等
* @return {@link BitMatrix}
* @since 4.1.2
*/
@@ -282,11 +281,11 @@ public class QrCodeUtil {
/**
* 将文本内容编码为条形码或二维码
*
*
* @param content 文本内容
* @param format 格式枚举
* @param width 宽度
* @param height 高度
* @param format 格式枚举
* @param width 宽度
* @param height 高度
* @return {@link BitMatrix}
*/
public static BitMatrix encode(String content, BarcodeFormat format, int width, int height) {
@@ -295,10 +294,10 @@ public class QrCodeUtil {
/**
* 将文本内容编码为条形码或二维码
*
*
* @param content 文本内容
* @param format 格式枚举
* @param config 二维码配置,包括长、宽、边距、颜色等
* @param format 格式枚举
* @param config 二维码配置,包括长、宽、边距、颜色等
* @return {@link BitMatrix}
* @since 4.1.2
*/
@@ -319,9 +318,10 @@ public class QrCodeUtil {
}
// ------------------------------------------------------------------------------------------------------------------- decode
/**
* 解码二维码图片为文本
*
*
* @param qrCodeInputstream 二维码输入流
* @return 解码文本
*/
@@ -331,7 +331,7 @@ public class QrCodeUtil {
/**
* 解码二维码图片为文本
*
*
* @param qrCodeFile 二维码文件
* @return 解码文本
*/
@@ -341,7 +341,7 @@ public class QrCodeUtil {
/**
* 将二维码图片解码为文本
*
*
* @param image {@link Image} 二维码图片
* @return 解码后的文本
*/
@@ -351,9 +351,9 @@ public class QrCodeUtil {
/**
* 将二维码图片解码为文本
*
* @param image {@link Image} 二维码图片
* @param isTryHarder 是否优化精度
*
* @param image {@link Image} 二维码图片
* @param isTryHarder 是否优化精度
* @param isPureBarcode 是否使用复杂模式扫描带logo的二维码设为true
* @return 解码后的文本
* @since 4.3.1
@@ -389,8 +389,8 @@ public class QrCodeUtil {
/**
* BitMatrix转BufferedImage
*
* @param matrix BitMatrix
*
* @param matrix BitMatrix
* @param foreColor 前景色
* @param backColor 背景色(null表示透明背景)
* @return BufferedImage
@@ -402,9 +402,9 @@ public class QrCodeUtil {
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++) {
if(matrix.get(x, y)) {
if (matrix.get(x, y)) {
image.setRGB(x, y, foreColor);
} else if(null != backColor){
} else if (null != backColor) {
image.setRGB(x, y, backColor);
}
}

View File

@@ -1,16 +1,14 @@
package cn.hutool.extra.qrcode;
import java.awt.Color;
import java.io.File;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Console;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import org.junit.Ignore;
import org.junit.Test;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Console;
import java.awt.Color;
import java.io.File;
/**
* 二维码工具类单元测试
@@ -61,7 +59,7 @@ public class QrCodeUtilTest {
System.out.println(base64);
byte[] bytes = FileUtil.readBytes(
new File("e:/pic/qr.png"));
new File("d:/test/qr.png"));
String encode = Base64.encode(bytes);
String base641 = QrCodeUtil.generateAsBase64("http://hutool.cn/", new QrConfig(400, 400), "png", encode);
System.out.println(base641);