似水如水 2023-03-30 11:16 采纳率: 60%
浏览 25
已结题

关于#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();

  • 写回答

1条回答 默认 最新

  • isMae 2023-03-30 11:31
    关注

    可以使用一个 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;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 4月7日
  • 已采纳回答 3月30日
  • 修改了问题 3月30日
  • 创建了问题 3月30日

悬赏问题

  • ¥15 yolov8边框坐标
  • ¥15 matlab中使用gurobi时报错
  • ¥15 WPF 大屏看板表格背景图片设置
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真