iOS 播放动图的第三方框架简单调研

SDWebImage

在使用SDWebImage 作为图片加载缓存框架的时候 支持 gif 和 webp 格式的图片
优点就是集成在图片缓存库中 简单实用

GIF

利用 CGImageSourceCreateWithData 解析图片数据
然后 利用 CGImageSourceGetCount 分析图片资源帧数
如果帧数大于 1, 则获取每一帧的图片与持续时间, 得到图片数组和总时长
最后使用

+ (nullable UIImage *)animatedImageWithImages:(NSArray<UIImage *> *)images duration:(NSTimeInterval)duration 

生成动画 image

缺陷是每一张图片的时长平均分配, 性能低, 占用内存
优点是系统 API 简单

webp

使用了 libwebp 框架, 分析图片数据, 如果图片数据有效, 解析出 WebPDecoderConfig
对象, 然后通过 CGImageCreate 方法重绘图片

FLAnimatedImage

专注于显示 GIF 的第三方框架 功能强大 支持GIF 帧级别的缓存 优化 显示GIF 内存 优化了拖动时候的显示效果 支持 GIF 的属性 (每帧的 delay/ 循环次数 等等)
缺点就是使用的自定义控件 只能支持 GIF

实现原理

获取GIF 数据
根据 NSData 生成 FLAnimatedImage 对象
使用NSHashTable作为图片的简单缓存 收到内存警告的时候 clean
也是通过数据 获取 CGImageSourceRef 并且获取每一帧图片(只缓存要显示的第一张图片) 获取每一帧的 delay time
FLAnimatedImage 对象 赋值给 FLAnimatedImageView 对象 显示 GIF
FLAnimatedImageView 是 UIImageView 的子类
FLAnimatedImageView 使用的是 CADisplayLink 执行动画 并且可以自定义 runloop Mode
CADisplayLink 根据每帧的时长显示切换图片

YYImage

强大的功能, 几乎支持所有类型的图片

Display/encode/decode animated image with these types:

    WebP, APNG, GIF.

Display/encode/decode still image with these types:

    WebP, PNG, GIF, JPEG, JP2, TIFF, BMP, ICO, ICNS.

Baseline/progressive/interlaced image decode with these types:

    PNG, GIF, JPEG, BMP.

显示动图

YYAnimatedImageView 是 UIImageView 的子类, YYAnimatedImage
当赋值的 image 满足 YYAnimatedImage 协议的话 则显示动画

YYAnimatedImageView 显示的基本逻辑与FLAnimatedImageView基本相同
但是 YYAnimatedImageView 的优点就是更好的封装 基本使用起来和原生毫无区别 满足原生的动画播放 高亮 普通图片等多种原生的功能
在线程安全上也更加严谨 使用了锁和队列来控制

实现图片动画

YYSpriteSheetImage 类实现了 YYAnimatedImage 协议 可以通过设置图片和图片帧 content
rect 信息和图片帧持续时间信息 来实现一张图片的动画变换效果

实现类gif效果(可以自定义每帧时长)的图片组动画

YYFrameImage 类实现了 YYAnimatedImage 协议 可以通过设置图片(或者路径) 和 每张图片的持续时间 来实现 动画切换动画

     NSArray *paths = @[@"/ani/frame1.png", @"/ani/frame2.png", @"/ani/frame3.png"];
     NSArray *times = @[@0.1, @0.2, @0.1];
     YYFrameImage *image = [YYFrameImage alloc] initWithImagePaths:paths frameDurations:times repeats:YES];
     YYAnimatedImageView *imageView = [YYAnimatedImageView alloc] initWithImage:image];
     [view addSubView:imageView];

类的介绍

YYImage 是 UIImage 的子类, 基础类, 实现了 YYAnimatedImage 协议, 通过 data 解析出图片类型 YYImageType

YYImage 的核心类, YYImageCoder, 图片编码/解码器, YYImage 的核心, 也是最大的一个类 有约 3000 行的代码

YYImageFrame 图片帧对象 提供图片帧的基本信息
YYImageDecoder 图片解码器 解析 NSData
YYImageEncoder 图片编码器 把UIImage 编码程某一种格式的文件

**

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容