使用 animated-gif-lib 依赖中的 AnimatedGifEncoder 生成 gif 验证码图片, 如果通过 HttpServletResponse.getOutputStream 返回,无法添加 body 返回其他信息,请问如何将 AnimatedGifEncoder 转成 BufferedImage 或者直接 转成 base64 字符串 ,方便返回时附带其他信息
@GetMapping("/captchagif")
public captchagif(HttpServletResponse response) throws IOException {
captchaService.getGif(response.getOutputStream());
}
//创建动图的方法
AnimatedGifEncoder e = new AnimatedGifEncoder();
e.start(os); // HttpServletResponse.getOutputStream
e.setSize(imgWidth,imgHeight); //图片长宽常量
e.setDelay(400); //图片间隔 ms
e.setRepeat(0); //循环播放
e.addFrame(imgCanvas); //添加图片
e.finish();
可以使用一个 Map 对象将图片数据和其他信息封装起来,然后将其转换成 JSON 字符串返回,下面代码你可以参考下
@GetMapping("/captchagif")
public String captchagif(HttpServletResponse response) throws IOException {
ByteArrayOutputStream os = new ByteArrayOutputStream();
// 创建动态图片
AnimatedGifEncoder encoder = new AnimatedGifEncoder();
encoder.start(os);
encoder.setSize(120, 50);
encoder.setDelay(200);
for (int i = 0; i < 10; i++) {
BufferedImage frame = createFrame(i); // 创建一帧图片
encoder.addFrame(frame);
}
encoder.finish();
// 将动态图片转换成 BufferedImage
byte[] gifBytes = os.toByteArray();
ByteArrayInputStream bis = new ByteArrayInputStream(gifBytes);
BufferedImage bufferedImage = ImageIO.read(bis);
// 将动态图片转换成 Base64 字符串
String base64String = Base64.getEncoder().encodeToString(gifBytes);
// 创建返回结果对象
Map<String, Object> result = new HashMap<>();
result.put("image", "data:image/gif;base64," + base64String);
result.put("msg", "验证码生成成功");
// 将 BufferedImage 转换成 JSON 字符串并添加到返回结果中
ObjectMapper objectMapper = new ObjectMapper();
result.put("bufferedImage", objectMapper.writeValueAsString(bufferedImage));
// 将返回结果转换成 JSON 字符串并返回
return objectMapper.writeValueAsString(result);
}
private BufferedImage createFrame(int index) {
// 创建一帧图片的逻辑
BufferedImage frame = new BufferedImage(120, 50, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = frame.createGraphics();
g2d.setColor(Color.WHITE);
g2d.fillRect(0, 0, 120, 50);
g2d.setColor(Color.BLACK);
g2d.drawString("Frame " + index, 30, 30);
g2d.dispose();
return frame;
}