iOS之加载Gif图片的几种方法

iOS之加载Gif图片的几种方法,第1张

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

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11267876.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存