关于#animated#的问题,如何解决?

使用 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;
}