Gif图片是非常常见的图片格式,尤其是在聊天的过程中,Gif表情使用地很频繁。但是iOS竟然没有现成的支持加载和播放Gif的类。
简单地汇总了一下,大概有以下几种方法:
但是使用 UIWebView 的弊端在于,不能设置Gif动画的播放时间。
最好把所需要的Gif图片打包到 Bundle 文件内,如下图所示
[图片上传失败...(image-64cf3c-1520924420422)]
但是很遗憾, SDWebImage 的 sd_setImageWithURL:placeholderImage: 这个方法是不能播放本地Gif的,它只能显示Gif的第一张图片而已。So,此方法行不通
其实,在 SDWebImage 这个库里有一个 UIImage+GIF 的类别,里面为 UIImage 扩展了三个方法:
大家一看就知道,我们要获取处理后的Gif图片,其实只要调用前面两个中的其中一个方法就行了
我们就使用第二个方法试一试效果:
然后通过断点,我们看下获取到的image是个什么样的东东:
[图片上传失败...(image-2a63c5-1520924420421)]
我们发现:
其实,动画执续时间 _duration 也可以更改!
我们来看下此方法的内部实现:
很明显,duration是可以随意更改的,只不过此方法设置了一个默认值
( duration = (1.0f / 10.0f) * count )
归根到底,创建新的动态的Image其实是调用了系统提供的一个 UIImage 的类方法而已:
加载网络的Gif文件就简单多了。最简单的方法,我们只需要使用 SDWebImage 的 sd_setImageWithURL: 这个方法传入Gif文件是url地址即可。
纠其原因:稍微仔细看了 SDWebImage 内部实现就可以清楚,大概是以下几个步骤:
............................................................
1、使用 UIWebView 不可以设置 duration ,其他两种方法都可设置。而且方法1的容器为 UIWebView ,其余两种的容器都是大家熟悉的 UIImageView
2、方法2和方法3需要对应看应用场景
直接使用 SDWebImage 的 sd_setImageWithURL: 这个方法传入Gif文件是url地址即可
“捷径”软件可以制作GIF。
具体 *** 作方法如下:
1、下载“捷径”软件后,点击打开,再点击“创建捷径”。
2、搜索“设定变量”,将变量名称改为“src”。
搜索“计数”,点击选择后,在“数量”一栏选择“项目”。
搜索“如果”,在“输入”一栏选择“小于”,在“数字”一栏输入“1”。
搜索“选择照片”,点击选择后,将”选择多张“按钮打开。
3、搜索”设定变量“,点击选择后,将变量名称改为“src”。
分别长按”选择照片“和”设定变量“,依次移动到”如果“和”否则“之间。
搜索”获取变量“,点击选择后,将变量名称选择为“src”。
搜索”从列表中获取项目“,点击选择。
4、搜索'获取图像的详细信息”,点击选择后,在“获取”一栏选取“宽度”。
搜索“设定变量”,点击选择后,将变量名称改为“width”。
搜索“如果”,在“输入”一栏选择“大于”,在“数字”一栏输入“2000”。
搜索“数字”,点击选择后,将“数字”设置为“2000”。
5、搜索“设定变量”,点击选择后,将变量名称改为“width”。
分别长按”数字“和”设定变量“,依次移动到”如果“和”否则“之间。
搜索“获取变量”,点击选择后,在“变量”一栏选取“src”
6、搜索“制作”,找到并点击“制作GIF"。在“每张照片的播放秒数”一栏选取“运行时询问”,在“自动设置大小”一栏,将开关关闭,将“宽度”一栏选取“width”,其他不做修改。
搜索“快速查看”,点击并选择。
7、搜索“显示提醒”,将“标题”重命名为“是否保存到相册?”,将英文内容删除。
搜索“存储到相簿”,点击并选择。
8、如下图所示,点击红框内容进行重命名。
9、按照下图所示内容进行重命名和siri语音录制,手机就可以一键制作gif图。
当我们网络加载GIF,或者获取到本地GIF的数据data时,可以将data转换成动图UIImage
//获取动图
+ (UIImage *)animatedGIFWithData:(NSData *)data {
if (!data) {
return nil
}
//获取动图源数据
CGImageSourceRef source = CGImageSourceCreateWithData(( __bridge CFDataRef)data, NULL )
//获取动图图片集数量
size_t count = CGImageSourceGetCount(source)
UIImage * animatedImage
//如果图片集只有一张,那么直接创建成一张图片,否则合成一个动图
if (count <=1) {
animatedImage = [[UIImage alloc]initWithData:data]
} else {
NSMutableArray * images = [NSMutableArray array]
//记录动图总时长
NSTimeInterval duration =0.0f
//遍历每张图片
for (size_t i =0i <counti++) {
CGImageRef image =CGImageSourceCreateImageAtIndex(source, i, NULL )
//获取单张动图时间间距
duration += [ self frameDurationAtIndex:i source:source]
[images addObject:[UIImage imageWithCGImage:image scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp]]
CGImageRelease(image)
}
//若未获取到时长,,自定义时长为0.1x张数,,这里可以根据需求自定义
if (!duration) {
duration = (1.0f/10.0f) * count
}
//创建动图
animatedImage = [UIImage animatedImageWithImages:images duration:duration]
}
CFRelease(source)
return animatedImage
}
+ ( float )frameDurationAtIndex:(NSUInteger)index source:(CGImageSourceRef)source {
float frameDuration =0.1f
CFDictionaryRef cfFrameProperties = CGImageSourceCopyPropertiesAtIndex(source, index, nil )
NSDictionary * frameProperties = ( __bridge NSDictionary*)cfFrameProperties
NSDictionary * gifProperties = frameProperties[(NSString*)kCGImagePropertyGIFDictionary]
NSNumber * delayTimeUnclampedProp = gifProperties[(NSString*)kCGImagePropertyGIFUnclampedDelayTime]
if (delayTimeUnclampedProp) {
frameDuration = [delayTimeUnclampedProp floatValue]
}
else {
NSNumber * delayTimeProp = gifProperties[(NSString*)kCGImagePropertyGIFDelayTime]
if (delayTimeProp) {
frameDuration = [delayTimeProp floatValue]
}
}
CFRelease(cfFrameProperties)
return frameDuration
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)