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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容