iOS开发之初:根据一张gif图,返回其中每一帧的图片数组(ImageView加载gif))

在iOS开发中,当需要使用gif图进行刷新或加载动画时,UIImageView默认不支持加载gif。为此,可以通过将gif图拆分为多个帧的UIImage数组来实现动画效果。本文介绍如何通过ImageIO框架,从gif图中获取UIImage数组,从而在UIImageView中播放动画。详细步骤包括获取gif源数据、生成CGImageRef以及转换为UIImage。这种方法适用于没有美工资源,只能使用单一gif图的情况。

在APP开发过程中能用到gif图的地方无非就是刷新和加载动画了(等用到小动画的地方).但是UIImageView是无法直接加载gif图的,ImageView提供了一个加载动画图片数组的方法..那要有很多帧.png/.jpg的图片才行…但是像我这种没有美工的开发,网上只找了一张gif图怎么办….
为数组类别,添加一个类方法–由一张项目中的gif图的名字返回其中很多帧UIImage的数组.

@interface NSArray (CDIExtention)
/** 将一个gif图转换为一帧一帧的图片数组*/
+ (NSArray *)cdi_imagesWithGif:(NSString *)gifNameInBoundle;

导入ImageIO框架
(1) 获取到GIF图的源数据 CGImageSourceRef

CGImageSourceRef gifSource = CGImageSourceCreateWithURL((CFURLRef)fileUrl, NULL);

(2) 由源数据 SourceRef生成一张CGImageRef类型图片

 CGImageRef imageRef = CGImageSourceCreateImageAtIndex(gifSource, i, NULL);

(3) 有CGImageRef生成UIImage ,我们想要的.

 UIImage *image = [UIImage imageWithCGImage:imageRef];

.m文件内容如下,最好要返回数组,方便ImageView截取数组哪一段进行动画

#import <ImageIO/ImageIO.h>
@implementation NSArray (CDIExtention)

+ (NSArray *)cdi_imagesWithGif:(NSString *)gifNameInBoundle {
    NSURL *fileUrl = [[NSBundle mainBundle] URLForResource:gifNameInBoundle withExtension:@"gif"];

    CGImageSourceRef gifSource = CGImageSourceCreateWithURL((CFURLRef)fileUrl, NULL);
    size_t gifCount = CGImageSourceGetCount(gifSource);
    NSMutableArray *frames = [[NSMutableArray alloc]init];
    for (size_t i = 0; i< gifCount; i++) {
        CGImageRef imageRef = CGImageSourceCreateImageAtIndex(gifSource, i, NULL);
        UIImage *image = [UIImage imageWithCGImage:imageRef];
        [frames addObject:image];
        CGImageRelease(imageRef);
    }
    return frames;
}
@end

更详细的参考:http://www.cnblogs.com/PengHongMiao/p/5897999.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值