美文网首页
2018-09-28

2018-09-28

作者: Mr_墨 | 来源:发表于2018-09-28 16:45 被阅读10次

iOS 分析一个支持GIF的UIImage扩展:YLGIFImage 

Github:  YLGIFImage

这个extension代码不多,主要通过Apple的ImageIO框架进行解析GIF。

整个扩展最核心还是下面的函数,搞了半天还是Apple的UIImage的类函数。所以重点就是找到GIF中的每一帧图片和每一帧的延迟是多少。

只要通过该函数返回的UIImage就是一个带动画的UIImage(记得我当年切了几个图还新建NSTimer实现动画…)

可见会调用API的重要性…

let animation = UIImage.animatedImageWithImages(frames,duration: Double(duration) /1000.0)

大致过程如下:

1.imageName.GIF文件 -> NSData

contentsOfURL函数:

2.NSdata -> CGImageSource

CGImageSourceCreateWithData函数

3.从CGImageSource的对象中取得图片张数

CGImageSourceGetCount(source)

4.创建CGImage类型的数组,将CGImageSource中的图片一张张的添加到该数组中

CGImageSourceCreateImageAtIndex(source, i, nil)

5.创建delay数组,将CGImageSource中的每一帧的图片的延迟加入数组,这个函数比较麻烦

先是取得CGImageSource中的某个实体,类型是CFDictionary:

        let cfProperties = CGImageSourceCopyPropertiesAtIndex(source, index, nil)

然后取得该字典中的Gif类型的字典,类型是CFDictionaryRef(CFDictionary的引用,是一样的)

    let gifProperties: CFDictionaryRef = unsafeBitCast(

            CFDictionaryGetValue(cfProperties,

                unsafeAddressOf(kCGImagePropertyGIFDictionary)),

CFDictionary.self)

然后从GIF字典中取得延迟时间,这里取2次,先是尝试了kCGImagePropertyGIFUnclampedDelayTime,再尝试kCGImagePropertyGIFDelayTime:

var delayObject: AnyObject = unsafeBitCast(

            CFDictionaryGetValue(gifProperties,

                unsafeAddressOf(kCGImagePropertyGIFUnclampedDelayTime)),

            AnyObject.self)

if delayObject.doubleValue == 0 {

            delayObject = unsafeBitCast(CFDictionaryGetValue(gifProperties,

                unsafeAddressOf(kCGImagePropertyGIFDelayTime)), AnyObject.self)

        }

6.这样大概就按顺序构建起了2个数组,一个是CGImage数组,一个是延迟大小。

7.然后把CGImage的数组转成UIImage的数组,因为UIImage.animatedImageWithImages(frames,duration)需要传入的frames是IImage的数组。

从中我感受到,CoreImage、CoreAnimation等图像有关的框架非常强大,其中有很多useful的API

相关文章

  • 2018-09-28

    2018-09-28 学会淡定_c9c0 2018-09-28 16:59 · 字数 483 · 阅读 0 · 日...

  • 小小说一一局长的办公室

    2018-09-28 学会淡定_c9c0 2018-09-28 18:59 · 字数 937 · 阅读 0 · 日...

  • 是福?是悲?

    是福?是悲? 胡99(今年六十二)2018-09-28 时代真是不同了,在那饥寒交迫的年代,...

  • 神探球坛意甲分析 恩波利vsAC米兰

    比赛时间:2018-09-28 03:00开赛 比赛盘口:AC米兰-0.5球,大小球2.5/3球 比赛分析: 随著...

  • 《我不想去上学了》

    2018-09-28 注明:这是别人的文章。我很喜欢。 《我不想去上学了》 ——【土耳其】奥尔罕•帕慕克 我不想去...

  • 米兰作客 有”利”可图

    意甲:恩波利(主)VSAC米兰 开赛时间:2018-09-28凌晨3:00 两队积分排名: 两队对赛往绩: 恩波利...

  • 2018-09-30

    2018-09-28 北京的雨滴感恩日记第1059天 1、感恩今天是周五,今天先生休息,在家看孩子,谢谢!谢谢!谢...

  • 神探球坛意甲分析 史帕尔vs森索罗

    比赛时间:2018-09-28 01:00开赛 比赛盘口:平手盘,大小球2/2.5球 比赛分析: 随著欧冠以及欧罗...

  • 蛇不知自己有毒么

    2018-09-28 星期五 晴 实在不想再提那个老实人小黄,见她来我们都避开,张姐趴在桌子上装睡觉,...

  • 2018年的电影记录.下

    151. 2018-09-28「11:14」:杰妮推荐并亲自发资源给我的电影。之前电脑坏了一直没看电影- - 这一...

网友评论

      本文标题:2018-09-28

      本文链接:https://www.haomeiwen.com/subject/qrmpoftx.html