一、BufferedImage转base64
/**
* BufferedImage 编码转换为 base64
* @param bufferedImage
* @return
*/
private static String BufferedImageToBase64(BufferedImage bufferedImage) {
ByteArrayOutputStream bao = new ByteArrayOutputStream();//io流
try {
ImageIO.write(bufferedImage, "png", bao);//写入流中
} catch (IOException e) {
e.printStackTrace();
}
byte[] bytes = Base64.getEncoder().encode(bao.toByteArray());
String base64 = new String(bytes);
base64 = base64.replaceAll("\n", "").replaceAll("\r", "");//删除 \r\n
return "data:image/png;base64," + base64;
}
二、base64转BufferedImage
导包
import java.util.Base64; import java.util.Base64.Decoder;
/**
* base64 编码转换为 BufferedImage
* @param base64
* @return
*/
public static BufferedImage base64ToBufferedImage(String base64) {
Decoder decoder = Base64.getDecoder();
try {
byte[] byteArray = decoder.decode(base64);
ByteArrayInputStream bai = new ByteArrayInputStream(byteArray);
return ImageIO.read(bai);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
三、调用示例
3.1 调用BufferedImage转base64方法
controller代码
@GetMapping(value = "/testImg")
@ResponseBody
public String testImg(){
return JSON.toJSONString(new CommonView("200","成功",imgService.testBannerImg()));
}
service代码
public String testBannerImg() {
BufferedImage banner = null;
try {
banner = ImageIO.read(new File("F:\\Img\\ghost_K\\bj9.png"));//本地背景图
BufferedImage code = ImageIO.read(new URL("https://*********************"));//二维码
code = resizeImage(code, 360, 360);//调整图片大小
if (banner == null || code == null) {
return null;
}
Graphics2D g = banner.createGraphics();
int x = 250; //x轴偏移
int y = 375; //y轴偏移
g.drawImage(code, x, y, code.getWidth(), code.getHeight(), null);
g.dispose();
String base64 = BufferedImageToBase64(banner);//调用转base64方法
return base64;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
运行结果
3.1 调用base64转BufferedImage
controller代码
由于base64数据过长,所以直接使用http请求刚才生成的结果转成JSON数据获取base64数据
@GetMapping(value = "/testImg2")
public Object testImg2(HttpServletResponse response){
String urlResult = HttpUtil.get("http://localhost:9080/test/testImg");
JSONObject jsonObject = JSONObject.parseObject(urlResult);
Object base64 = jsonObject.get("data");
BufferedImage bufferedImage = imgService.testBannerImg2(base64.toString());
try {
ImageIO.write(bufferedImage, "png", response.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
service代码
public BufferedImage testBannerImg2(String base64) {
return base64ToBufferedImage(base64);//调用base64转BufferedImage
}
注意点
直接调用ImageIO.write(bufferedImage, "png", response.getOutputStream());输出图片时base64中不能包含"data:image/png;base64,",否则会报IllegalArgumentException: Illegal base64 character 3a这个错误。
错误原因:base64 编码中存在 data:image/png;base64,
运行结果,成功解析出图片