- (void)downloadImages:(int)index {

//下载图片

NSBlockOperation *download = [NSBlockOperation blockOperationWithBlock:^{

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];

if (!data) return;

UIImage *image = getImageWithData(data);

//取到的data有可能不是图片

if (image) {

self.images[index] = image;

//如果下载的图片为当前要显示的图片,直接到主线程给imageView赋值,否则要等到下一轮才会显示

NSLog(@"images_index= %ld",index);

if (_currIndex == index) [_currImageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];

if (_autoCache) [data writeToFile:path atomically:YES];

}

}];

[self.queue addOperation:download];

}

#pragma mark 下载图片,如果是gif则计算动画时长

UIImage *getImageWithData(NSData *data) {

CGImageSourceRef imageSource = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL);

size_t count = CGImageSourceGetCount(imageSource);

if (count <= 1) { //非gif

CFRelease(imageSource);

return [[UIImage alloc] initWithData:data];

} else { //gif图片

NSMutableArray *images = [NSMutableArray array];

NSTimeInterval duration = 0;

for (size_t i = 0; i < count; i++) {

CGImageRef image = CGImageSourceCreateImageAtIndex(imageSource, i, NULL);

if (!image) continue;

duration += durationWithSourceAtIndex(imageSource, i);

[images addObject:[UIImage imageWithCGImage:image]];

CGImageRelease(image);

}

if (!duration) duration = 0.1 * count;

CFRelease(imageSource);

return [UIImage animatedImageWithImages:images duration:duration];

}

}

#pragma mark 获取每一帧图片的时长

float durationWithSourceAtIndex(CGImageSourceRef source, NSUInteger index) {

float duration = 0.1f;

CFDictionaryRef propertiesRef = CGImageSourceCopyPropertiesAtIndex(source, index, nil);

NSDictionary *properties = (__bridge NSDictionary *)propertiesRef;

NSDictionary *gifProperties = properties[(NSString *)kCGImagePropertyGIFDictionary];

NSNumber *delayTime = gifProperties[(NSString *)kCGImagePropertyGIFUnclampedDelayTime];

if (delayTime) duration = delayTime.floatValue;

else {

delayTime = gifProperties[(NSString *)kCGImagePropertyGIFDelayTime];

if (delayTime) duration = delayTime.floatValue;

}

CFRelease(propertiesRef);

return duration;

}

iOS 播放.GIF图片相关推荐

  1. iOS 播放gif图片

    引言:我们在用SDWebImage的时候, 如果图片是.gif的时候,是自动无限循环播放的,而如果我们只需要播放有限次数gif图的时候,是没有办法的,接下来让我们看看不用第三方如何播放gif图吧. D ...

  2. iOS 播放gif动态图的方式探讨

    原文链接:http://my.oschina.net/u/2340880/blog/608560 摘要 iOS中没有现成的接口来展示gif动态图,但可以通过其他的方式来处理gif图的展示. iOS中播 ...

  3. ios播放视频demo

    今天要用到ios原生态播放一段网络视频,在此整理共享出来 白白手游专栏http://blog.csdn.net/u010229677 首先需要给工程添加框架MediaPlayer.Framework ...

  4. ios关于GPUImage图片拍摄及视频录制

    @ios关于GPUImage图片拍摄及视频录制 GPUImage图片拍摄及视频录制.给以后视频添加滤镜 基本属性 GPUImageVideoCamera 视频拍摄: GPUImageStillCame ...

  5. android首页图片轮播效果,Android_Android自动播放Banner图片轮播效果,先看一下效果图支持本地图 - phpStudy...

    Android自动播放Banner图片轮播效果 先看一下效果图 支持本地图片以及网络图片or本地网络混合. 使用方式: android:id="@+id/banner" andro ...

  6. Unity3d(U3D) Windows/Android/IOS 播放rtmp/rtsp方案

    如果基于Unity3d完全重新开发一个播放器,代价大,周期长,不适合快速出产品,最好的方式就是集成现有Native平台上成熟稳定播放器. 集成Navtive播放器可行性分析: 安卓: Unity3d可 ...

  7. 非常优秀的swiper插件————幻灯片播放、图片轮播

    非常优秀的swiper插件----幻灯片播放.图片轮播 http://www.idangero.us/ http://www.swiper.com.cn/ Swiper中文网 2015-10-15 S ...

  8. Java ffmpeg视频压缩IOS播放没有声音问题解决(超级简单)

    排查问题:ffmpeg视频压缩IOS播放没有声音问题 解决方法:将音频格式设置为:aac:将视频格式设置为h264: 查询了好多文章,总结如下,废话少说,直接上代码: public static vo ...

  9. WPF中播放GIF图片

    WPF中播放GIF图片 文章目录 WPF中播放GIF图片 1.安装WpfAnimatedGif Nuget包 2.程序中使用 3.源代码 4. WpfAnimatedGif GitHub源代码 1.安 ...

最新文章

  1. TCP通信的客户端代码实现
  2. linux耳机检测,Audio Jack 的耳机检测和按键检测
  3. C++的静态联编和动态联编
  4. clover写入efi_MAC 10.14 安装教程10-基于黑果小兵大神EFI文件的修改过程
  5. Mac 百度云加速下载,突破限速,大文件无压力(小白使用无压力)
  6. ModelAndView 详解
  7. EEE(Energy Efficient Ethernet)-节能以太网
  8. SQLiteSpy下载安装
  9. 虚拟化最大的市场将出现在3G手机领域
  10. proteus中仿真arduino利用74hc373实现抢答器
  11. Ubuntu + nvidia驱动+ cuda安装教程以及重装问题
  12. (萌新的数电学习)用VHDL语言设计4位行波进位加法器
  13. Spring——面向切面编程(AOP)
  14. 准确率Accuracy与损失函数Loss的关系
  15. 微型计算机中使用较多的是SATA接口,NVMe U.2+PCIe SSD三盘RAID 0首发测试
  16. 只会收藏松果的“松鼠”
  17. 2016.11.21回顾 卡方检验
  18. 计算多项式值的秦九韶算法
  19. 智慧警务——大数据时代的警务模式
  20. PDF在线压缩怎么操作?这里有你不知道的方法

热门文章

  1. vba excel 开发游戏_VBA代码助手专业版正式发布,让天下没有难写的VBA代码
  2. Excel 复制一类数据到另一列合并过单元格的列中
  3. WinPE修改超级管理员密码的方法
  4. 计算机网络工程刷题,一、计算机网络刷题
  5. java list和array区别_Array和List的区别
  6. CS5210设计HDMI to VGA方案 CS5210方案
  7. 罗永浩2020跨年演讲音频视频下载
  8. 通过swig将C/C++代码暴露给python
  9. 30. secure world对smc请求的处理------OP-TEE对fast smc请求的处理
  10. maven生命周期及常见命令