Github:https://github.com/bahlo/SwiftGif

这个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

iOS 分析一个支持GIF的UIImage扩展:SwiftGIF的更多相关文章

  1. iOS 模仿一个小项目,总结一下里边的模块

      ManoBoo:  参考链接:http://www.jianshu.com/p/fd4c46c31508  这个小的项目是参考ManoBoo的简书的,链接在上方,自己在仿做的过程中,也离不开Man ...

  2. iOS UIImage扩展方法(category):放大、旋转、合并UIImage、增加渐变层、添加阴影、调节透明度、保存到相册

    一有用的 UIImage 扩展,支持(等比例)放大和旋转可在许多 App 中使用. UIImage-Extensions.h #import <Foundation/Foundation.h&g ...

  3. iOS工程如何支持64-bit(转)

    苹果在2014年10月20号发布了一条消息:从明年的二月一号开始,提交到App Store的应用必须支持64-bit.详细消息地址为:https://developer.apple.com/news/ ...

  4. iOS工程如何支持64-bit

    苹果在2014年10月20号发布了一条消息:从明年的二月一号开始,提交到App Store的应用必须支持64-bit.详细消息地址为:https://developer.apple.com/news/ ...

  5. dubbo源码分析之基于SPI的强大扩展

    https://blog.csdn.net/luoyang_java/article/details/86609045 Dubbo采用微内核+插件体系,使得设计优雅,扩展性强.那所谓的微内核+插件体系 ...

  6. 一个支持高网络吞吐量、基于机器性能评分的TCP负载均衡器gobalan

    一个支持高网络吞吐量.基于机器性能评分的TCP负载均衡器gobalan 作者最近用golang实现了一个TCP负载均衡器,灵感来自grpc.几个主要的特性就是: 支持高网络吞吐量 实现了基于机器性能评 ...

  7. FizzlerEx —— 另一个HtmlAgilityPack的CSS选择器扩展,

    之前我介绍过HtmlAgilityPack的CSS选择器扩展——ScrapySharp,它可以非常方便的实现通过CSS选择器表达式来查询HtmlNode.今天在使用的过程中,发现它不支持nth-chi ...

  8. python 开发一个支持多用户在线的FTP

    ### 作者介绍:* author:lzl### 博客地址:* http://www.cnblogs.com/lianzhilei/p/5813986.html### 功能实现 作业:开发一个支持多用 ...

  9. Postman 是一个非常棒的Chrome扩展,提供功能强大的API & HTTP 请求调试

    Postman 是一个非常棒的Chrome扩展,提供功能强大的API & HTTP 请求调试   需要FQ才能安装,使用时应该不用FQ了,除非使用postman的历史记录功能:   非常棒的C ...

随机推荐

  1. Windows on Device 项目实践 5 - 姿态控制灯制作

    在前面几篇文章中,我们学习了如何利用Intel Galileo开发板和Windows on Device来设计并完成PWM调光灯.感光灯.火焰报警器和智能风扇的制作,涉及到了火焰传感器.DC直流电机. ...

  2. LoadRunner 11 安装步骤

    loadrunner 安装步骤: LoadRunner11下载:  在网上可以搜索到,在这个就不提供了. LoadRunner11原理: 破解方法和以前版本相同,我用的是LR8.0的破解文件,同样实用 ...

  3. CGLib动态代理原理及实现

    JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了.CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采 ...

  4. 【转】JVM运行原理及JVM中的Stack和Heap的实现过程

    来自: http://blog.csdn.net//u011067360/article/details/46047521 Java语言写的源程序通过Java编译器,编译成与平台无关的‘字节码程序’( ...

  5. Memcached在windows下安装与使用

    建议:windows系统下仅为测试所有,生产环境下服务端应使用Linux系统. 本文最后更新于:2014-08-03 18:24 原文:http://www.yaosansi.com/post/mem ...

  6. EF 数据库连接字符串-集成安全性访问 SQL Server

    使用 Windows 集成安全性访问 SQL Server 如果您的应用程序运行在基于 Windows 的 Intranet 上,则也许可以将 Windows 集成身份验证用于数据库访问.集成安全性使 ...

  7. 第一次打开Lightroom时的基本设置

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/5 ...

  8. NOIP2009Hankson 的趣味题[唯一分解定理|暴力]

    题目描述 Hanks 博士是 BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson.现 在,刚刚放学回家的 Hankson 正在思考一个有趣的问题. 今天在课堂上,老师讲 ...

  9. onselectstart与onselect

    这两个事件看起来很相似,事实上却非常的不同. onselectstart onselectstart几乎可以用于所有对象,其触发时间为目标对象被开始选中时(即选中动作刚开始,尚未实质性被选中).该事件 ...

  10. 兼容firefox的 keyCode

    <script language = "javascript"> document.onkeydown=inLogin function inLogin(e) { va ...