播放GIF图片的内部实现

 
/*
  1 把用户传入的gif图片->NSData
  2 根据该Data创建一个图片数据源(NSData->CFImageSourceRef)
  3 计算该数据源中一共有多少帧,把每一帧数据取出来放到图片数组中
  4 根据得到的数组+计算的动画时间 == 可动画的image
  5 [UIImage animatedImageWithImages:images duration:duration];
   */

     CGImageSourceRef  source =  CGImageSourceCreateWithData (( __bridge CFDataRef )data,  NULL );
    
     size_t  count =  CGImageSourceGetCount (source);
    
     UIImage  *animatedImage;

//如果图片帧数小于等于1,那么就直接把二进制数据转换为图片,并返回图片
    if (count <= 1) {
         animatedImage = [[UIImage alloc] initWithData:data];
     }else {
         //创建可变的空的图片数组
         NSMutableArray *images = [NSMutableArray array];
         //初始化动画播放时间为0
         NSTimeInterval duration = 0.0f;
         // 遍历并且提取所有的动画帧
         for (size_t i = 0; i < count; i++) {
             CGImageRef image = CGImageSourceCreateImageAtIndex(source, i, NULL);
             // 累加动画时长
             duration += [self sd_frameDurationAtIndex:i source:source];
             // 将图像添加到动画数组
             [images addObject:[UIImage imageWithCGImage:image scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp]];
             //释放操作
             CGImageRelease(image);
         }
         //计算动画时间
         if (!duration) {
             duration = (1.0f / 10.0f) * count;
     }
         // 建立可动画图像
         animatedImage = [UIImage animatedImageWithImages:images duration:duration];
     }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值