Java将图片转为base64编码
直入主题,先上代码
/**
* 获取图片的Base64编码字符串
*
* @param imgPath 文件路径
* @return
*/
public String getImgBase64(String imgPath) {
// 将图片转为字节数组
byte[] imgData = null;
try {
imgData = Files.readAllBytes(Paths.get(imgPath));
} catch (IOException e) {
log.error("Read file to byteArray failed. Error: {}", e);
}
// 对字节数组进行Base64编码
String result = "";
if (imgData != null) {
// 使用JDK自带的Base64架包
byte[] baseByte = Base64.getEncoder().encode(imgData);
String base64 = new String(baseByte, StandardCharsets.UTF_8);
result = BASE64_PREFIX + base64; // BASE64_PREFIX = "data:image/png;base64,"
}
return result;
}
<img src="data:image/png;base64,......base64编码">
遇到的坑
前期看了篇老博客,自己也没有去研究目前有没有更好的替代方法,就直接用了,导致图片显示不出来,通过定位发现的问题的根源。
从旧代码看起(只关注差异点)
String result = "";
// 对字节数组进行Base64编码
if (imgData != null) {
BASE64Encoder encoder = new BASE64Encoder();
String base64 = encoder.encode(imgData);
result = BASE64_PREFIX + base64;
}
- 旧代码使用BASE64Decoder转码,使用该工具的encode方法转码出来的字符串带有换行字符,导致前端显示出问题。
- 现在发现该工具类未来可能会被删掉,且性能不佳。
- 贴一篇大佬对Base64的解读(不是自己写的):Java 8新特性探究(十一)Base64详解.
扩展:css中硬编码base64的64优缺点
- 优点
使用图片的base64编码来显示图片,可以节省一个http请求。如果是将图片存到静态资源文件下,则需要一个请求加载该图片。
百度将logo存在静态资源目录下,需要一个请求获取图片:
谷歌加载放大镜:
- 缺点
对于较大的图片不适合使用base64编码,编码后字节大小增加1/3倍,css文件也会变大。 - 贴一篇前端使用base64的攻略(不是自己写的):玩转图片Base64编码