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

@ -3,13 +3,15 @@
-------------------------------------------------------------------------------------------------------------
## 5.3.6 (2020-05-17)
## 5.3.6 (2020-05-19)
### 新特性
* 【core 】 NumberConverter Long类型增加日期转换pr#872@Github
* 【all 】 StrUtil and SymmetricCrypto注释修正pr#873@Github
* 【core 】 CsvReader支持返回Beanissue#869@Github
* 【core 】 Snowflake循环等待下一个时间时避免长时间循环加入对时钟倒退的判断pr#874@Github
* 【extra 】 新增 QRCode base64 编码形式返回pr#878@Github
* 【core 】 ImgUtil增加toBase64DateUriURLUtil增加getDataUri方法
### Bug修复

View File

@ -13,6 +13,7 @@ import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
@ -1261,6 +1262,20 @@ public class ImgUtil {
return IoUtil.toStream(toBytes(image, imageType));
}
/**
* 将图片对象转换为Base64的Data URI形式格式为data:image/[imageType];base64,[data]
*
* @param image 图片对象
* @param imageType 图片类型
* @return Base64的字符串表现形式
* @since 5.3.6
*/
public static String toBase64DateUri(Image image, String imageType) {
return URLUtil.getDataUri(
"image/" + imageType, "base64",
toBase64(image, imageType));
}
/**
* 将图片对象转换为Base64形式
*

View File

@ -28,7 +28,16 @@ import java.util.Map;
import java.util.jar.JarFile;
/**
* 统一资源定位符相关工具类
* URLUniform Resource Locator统一资源定位符相关工具类
*
* <p>
* 统一资源定位符描述了一台特定服务器上某资源的特定位置
* </p>
* URL组成
* <pre>
* 协议://主机名[:端口]/ 路径/[:参数] [?查询]#Fragment
* protocol :// hostname[:port] / path / [:parameters][?query]#fragment
* </pre>
*
* @author xiaoleilu
*/
@ -766,4 +775,57 @@ public class URLUtil {
}
}
}
/**
* Data URI Scheme封装data URI scheme 允许我们使用内联inline-code的方式在网页中包含数据<br>
* 目的是将一些小的数据直接嵌入到网页中从而不用再从外部文件载入常用于将图片嵌入网页
*
* <p>
* Data URI的格式规范
* <pre>
* data:[<mime type>][;charset=<charset>][;<encoding>],<encoded data>
* </pre>
*
* @param mimeType 可选项null表示无数据类型image/pngtext/plain等
* @param encoding 数据编码方式US-ASCIIBASE64等
* @param data 编码后的数据
* @return Data URI字符串
* @since 5.3.6
*/
public static String getDataUri(String mimeType, String encoding, String data){
return getDataUri(mimeType, null, encoding, data);
}
/**
* Data URI Scheme封装data URI scheme 允许我们使用内联inline-code的方式在网页中包含数据<br>
* 目的是将一些小的数据直接嵌入到网页中从而不用再从外部文件载入常用于将图片嵌入网页
*
* <p>
* Data URI的格式规范
* <pre>
* data:[<mime type>][;charset=<charset>][;<encoding>],<encoded data>
* </pre>
*
* @param mimeType 可选项null表示无数据类型image/pngtext/plain等
* @param charset 可选项null表示无源文本的字符集编码方式
* @param encoding 数据编码方式US-ASCIIBASE64等
* @param data 编码后的数据
* @return Data URI字符串
* @since 5.3.6
*/
public static String getDataUri(String mimeType, Charset charset, String encoding, String data){
final StringBuilder builder = StrUtil.builder("data:");
if(StrUtil.isNotBlank(mimeType)){
builder.append(mimeType);
}
if(null != charset){
builder.append(";charset=").append(charset.name());
}
if(StrUtil.isNotBlank(encoding)){
builder.append(';').append(encoding);
}
builder.append(',').append(data);
return builder.toString();
}
}

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,30 +57,40 @@ 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);
return generateAsBase64(content, qrConfig, imageType, ImgUtil.toImage(logo));
}
qrConfig.setImg(img);
/**
* 生成代 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[]形式表示
*
@ -256,6 +254,7 @@ public class QrCodeUtil {
}
// ------------------------------------------------------------------------------------------------------------------- encode
/**
* 将文本内容编码为二维码
*
@ -319,6 +318,7 @@ public class QrCodeUtil {
}
// ------------------------------------------------------------------------------------------------------------------- decode
/**
* 解码二维码图片为文本
*

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);