可以使用一个 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;
}