You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中提取GIF动图逐帧画面:代码仅获首帧的问题

问题分析

你的代码能正确获取GIF帧数,但只拿到第一帧,核心问题是Dart大小写敏感——你错误使用了frame.Image(大写I),而FrameInfo类的正确属性是小写的frame.image,这导致你每次循环都在重复添加第一帧的引用。

修正后的代码
import 'dart:ui' as ui;
import 'package:flutter/services.dart';

static Future<List<ui.Image>> loadAnimatedGif(String assetPath) async {
  List<ui.Image> gifFrames = [];
  ByteData data = await rootBundle.load(assetPath);
  ui.Codec codec = await ui.instantiateImageCodec(data.buffer.asUint8List());
  int frameCount = codec.frameCount;
  
  print("frame count: $frameCount");

  for (int i = 0; i < frameCount; i++) {
    ui.FrameInfo frameInfo = await codec.getNextFrame();
    // 修正属性名:使用小写的image
    gifFrames.add(frameInfo.image);
  }

  return gifFrames;
}
额外优化建议
  • 帧使用完毕后记得调用image.dispose()释放资源,避免内存泄漏:
    // 示例:遍历帧列表释放资源
    for (var image in gifFrames) {
      image.dispose();
    }
    
  • 部分GIF采用帧叠加逻辑(依赖上一帧像素),instantiateImageCodec默认会处理该逻辑,若需要提取独立完整的单帧像素,可额外配置解码参数,但多数场景下默认逻辑已满足需求。

内容的提问来源于stack exchange,提问作者jdevp2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 13:35:17