springboot读取resouce资源文件
InputStream logoInput = Thread.currentThread().getContextClassLoader().getResourceAsStream("logo.jpg");
将InputStream转换为image或者BufferedImage
BufferedImage image = ImageIO.read(inputStream);
将Base64码转换为inputStream再转换为image
java自带工具实现
Base64.Decoder decoder = Base64.getDecoder();
byte[] decode = decoder.decode(qrLogo);
ByteArrayInputStream inputStream = new ByteArrayInputStream(decode);
BufferedImage image = ImageIO.read(inputStream);
hutool工具实现
byte[] imageByte = Base64.decode(qrLogo);
ByteArrayInputStream inputStream = new ByteArrayInputStream(imageByte);
BufferedImage image = ImageIO.read(inputStream);
流程:base64->byte->inputStream->image
注意
ImageIO.read
读取的byte不可以是带有data:image/jpg;base64,
描述前缀的base64转为的byte,
一般通过Qr工具生成的二维码都是data:image/jpg;base64,开头的,所以我们需要把得到的base64删除
示例
@GetMapping("/qr")
public void get() throws IOException {
// 读取二维码文件
InputStream logoInput = Thread.currentThread().getContextClassLoader().getResourceAsStream("logo.jpg");
// 转换为base64码
String logoBase64 = Base64.encode(logoInput);
// 配置hutool二维码工具
QrConfig qrConfig = new QrConfig();
qrConfig.setBackColor(new Color(248, 248, 248, 1));
qrConfig.setForeColor(Color.BLACK);
qrConfig.setWidth(166);
qrConfig.setHeight(166);
qrConfig.setMargin(1);
qrConfig.setRatio(4);
// 获取响应输出流
ServletOutputStream outputStream = rsp.getOutputStream();
// 内容
String content = UUID.randomUUID().toString();
// 传入内容,二维码配置,logo文件格式,logo的base64码,“注意这里的base64也不可以带有data:image/jpg;base64,前缀”
String image64 = QrCodeUtil.generateAsBase64(content, qrConfig, "jpg", logoBase64);
// 将得到的二维码base64去除前缀解码字节码
byte[] imageByte = Base64.decode(image64.split(",")[1]);
// 将字节码转换为输入流
ByteArrayInputStream imageInput = new ByteArrayInputStream(imageByte);
// 从输入流读取图片
BufferedImage image = ImageIO.read(imageInput);
// 向输出流输出图片
ImageIO.write(image, "jpg", outputStream);
}
总之:工具需要的参数以及转换成image的base64都不可以带有前缀,但是工具生成的图片base64却是带有描述前缀的
其他文件换成用流循环读取可以达到同样的效果
未完待续…