Java读写gif格式图片,解决ImageIO读取gif文件只读取第一帧的问题(read and write gif format pictures in Java)

//Java API方式读取gif
final BufferedImage bufferedImage = ImageIO.read(new File(dir + "6.gif"));
//输出到新的文件
ImageIO.write(bufferedImage,"gif",new FileOutputStream(new File(dir +  "6-out.gif")));
//发现6-out.gif变成了静态图片

原因 ImageIO.read(new File(dir + "6.gif")) 只读取到了gif文件第一帧图像

解决步骤:

1.引入hutool

<dependency>
   <groupId>cn.hutool</groupId>
   <artifactId>hutool-all</artifactId>
   <version>5.7.11</version>
</dependency>

说明:若不想引入hutool,可以参见 https://github.com/rtyley/animated-gif-lib-for-javaicon-default.png?t=L9C2https://github.com/rtyley/animated-gif-lib-for-java

2.逐帧读取gif文件

//这里模拟上传文件接口
final MockMultipartFile file = new MockMultipartFile("6.gif", new FileInputStream(new File(dir + "6.gif")));
GifDecoder d = new GifDecoder();
d.read(file.getInputStream());
int n = d.getFrameCount();
List<BufferedImage> frames = new ArrayList<>();
for (int i = 0; i < n; i++) {
     BufferedImage frame = d.getFrame(i);  // frame i
     int t = d.getDelay(i);  // display duration of frame in milliseconds
     // do something with frame ,比如gif打水印,非法图片鉴定等
     frames.add(frame);
}

3.输出新的gif

File output = new File(dir + "out/1919.gif");
AnimatedGifEncoder e = new AnimatedGifEncoder();
e.start(new FileOutputStream(output));
e.setDelay(1000 / 24);   // 1 frame per sec
for (BufferedImage image : frames) {
   e.addFrame(image);
}
e.finish();

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值