GIF 五部走如下 :
 
1 从相册中取出GIF图的Data
2 通过腾讯的IM发送Gif图
3 展示GIF图
4 GIF图URL缓存机制
5 将展示的GIF图存到相册中
 
 
一  从相册中取出GIF图中的Data 
 
1.TZImagePickerController中利用方法来获取到gif图片的image和asses
 
- (void)imagePickerController:(TZImagePickerController *)picker didFinishPickingGifImage:(UIImage *)animatedImage sourceAssets:(id)asset
 
2.通过如下方法判断是否是gif格式:
 
if ([[asset valueForKey:@"filename"] tz_containsString:@"GIF"]) 
 
3.如果是gif图片格式,通过  PHImageManager  的方法利用字段assets来获取gif动图的data数据
 
 
二 通过腾讯的IM发送Gif图
 
1.将gif的数据存到临时文件夹
 
            NSString *tempDir = NSTemporaryDirectory();
            NSString *snapshotPath = [NSStringstringWithFormat:@"%@%3.f%@.gif", tempDir, [NSDatetimeIntervalSinceReferenceDate],[[NSProcessInfoprocessInfo] globallyUniqueString]];
            NSError *err;
            NSFileManager *fileMgr = [NSFileManagerdefaultManager];
            if (![fileMgr createFileAtPath:snapshotPath contents:imageData attributes:nil])
            {
                DebugLog(@"Upload Image Failed: fail to create uploadfile: %@", err);
            }
 
2.封装成消息体发送
 
            TIMMessage * msg = [[TIMMessagealloc] init];
            TIMImageElem * image_elem = [[TIMImageElemalloc] init];
           
            image_elem.path = snapshotPath;
            image_elem.format = TIM_IMAGE_FORMAT_GIF;
            image_elem.level = TIM_IMAGE_COMPRESS_ORIGIN;
            [msg addElem:image_elem];
 
 
                       @weakify(self);
            [self.conversationsendMessage:msg succ:^() {
                @strongify(self);
                //IDSPostNFWithObj(kIMPartyRoomSendMessage,msg);
                [selfforceUpdataTableView];
                NSLog(@"ddsuccess");
               
            } fail:^(int code, NSString *err) {
                NSLog(@"ddfailed");
            }];
 
 
三 展示GIF图
 
1.在 MJPhoto 中本地路径展示方式:
 
MJPhoto *photo = [[MJPhotoalloc] init];
NSData *data = [NSDatadataWithContentsOfFile:picModel.picPath];
photo.photodata = data;
photo.image = [UIImagesd_tz_animatedGIFWithData:data];
 
2.在 MJPhoto 远程url路径展示方式:
 
photo.image = [UIImagesd_tz_animatedGIFWithData:[NSDatadataWithContentsOfURL:[NSURLURLWithString:imageURL]]];
 
3.在 cell 中使用 FLAnimatedImageView 展示方式:
 
[self.animatedImageViewsd_setImageWithURL:imageURL];
 
Ps:前提是需要更新SDWebImage版本,需要有 FLAnimatedImageView+WebCache 文件
 
四 GIF图URL缓存机制
 
1.通过 gifURL 加入缓存机制:
 
                    NSURL *newUrl = [NSURLURLWithString:imageURL];
                    [[SDWebImageDownloadersharedDownloader] downloadImageWithURL:newUrl
                                                                          options:0
                                                                         progress:nil
                                                                        completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) {
                                                                            [[[SDWebImageManagersharedManager] imageCache] storeImage:image imageData:data forKey:newUrl.absoluteStringtoDisk:YEScompletion:^{
                                                                                photo.image = [UIImagesd_tz_animatedGIFWithData:data];
                                                                                photo.photodata = data;
                                                                            }];
                                                                        }];
                }
 
- (NSData *)imageDataFromDiskCacheWithKey:(NSString *)key
{
    NSString *path = [[[SDWebImageManagersharedManager] imageCache] defaultCachePathForKey:key];
    return [NSDatadataWithContentsOfFile:path];
}
 
 
五 将展示的GIF图存到相册中
 
 
            if ([UIDevicecurrentDevice].systemVersion.floatValue >= 9.0f) {
                [[PHPhotoLibrarysharedPhotoLibrary] performChanges:^{
                    PHAssetResourceCreationOptions *options = [[PHAssetResourceCreationOptionsalloc] init];
                    [[PHAssetCreationRequestcreationRequestForAsset] addResourceWithType:PHAssetResourceTypePhotodata:photo.photodataoptions:options];
                } completionHandler:^(BOOL success, NSError * _Nullable error) 
 
                        if (success) {
                            。。。
                        }
                        else {
                            。。。
                        }
                }];
            }
            else {
                UIImageWriteToSavedPhotosAlbum(photo.image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
            }
 
 
思考与行动:
 
1.写出 Gif格式的 URL 转换成 GIF格式的data数据类型的转换函数
 
2.写出 Gif格式的 UIImage 转换成 GIF格式的data数据类型的转换函数
 
3.写出Gif格式的data数据类型的转换成 GIF格式的UIImage的转换函数
 
4.写出 Gif格式的 Assets 转换成 GIF格式的data数据类型的转换函数
 
 
======
 
附录:
 
+ (UIImage *)sd_tz_animatedGIFWithData:(NSData *)data {
    if (!data) {
        returnnil;
    }
   
    CGImageSourceRef source = CGImageSourceCreateWithData((__bridgeCFDataRef)data, NULL);
   
    size_t count = CGImageSourceGetCount(source);
   
    UIImage *animatedImage;
   
    if (count <= 1) {
        animatedImage = [[UIImagealloc] initWithData:data];
    }
    else {
        NSMutableArray *images = [NSMutableArrayarray];
       
        NSTimeInterval duration = 0.0f;
       
        for (size_t i = 0; i < count; i++) {
            CGImageRef image = CGImageSourceCreateImageAtIndex(source, i, NULL);
            if (!image) {
                continue;
            }
           
            duration += [selfsd_frameDurationAtIndex:i source:source];
           
            [images addObject:[UIImageimageWithCGImage:image scale:[UIScreenmainScreen].scaleorientation:UIImageOrientationUp]];
           
            CGImageRelease(image);
        }
       
        if (!duration) {
            duration = (1.0f / 10.0f) * count;
        }
       
        animatedImage = [UIImageanimatedImageWithImages:images duration:duration];
    }
   
    CFRelease(source);
   
    return animatedImage;
}
 
...

iOS11中iOS处理GIF图片的方式的更多相关文章

  1. iOS11中navigationBar上 按钮图片设置frame无效 不受约束 产生错位问题 解决

    问题描述: 正常样式: 在iOS 11 iPhone X上显示效果: 观察顶部navBar上的左侧按钮  在ios 11 上  这个按钮的图片不受设置的尺寸约束,按其真实大小展示,造成图片错位,影响界 ...

  2. iOS开发中的4种数据持久化方式【二、数据库 SQLite3、Core Data 的运用】

                   在上文,我们介绍了ios开发中的其中2种数据持久化方式:属性列表.归档解档.本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运 ...

  3. iOS - 选取相册中iCloud云上图片和视频的处理

    关于iOS选取相册中iCloud云上图片和视频  推荐看:TZImagePickerController的源码,这个是一个非常靠谱的相册选择图片视频的库 .当然也可以自己写 如下遇到的问题 工作原因, ...

  4. IOS开发数据存储篇—IOS中的几种数据存储方式

    IOS开发数据存储篇—IOS中的几种数据存储方式 发表于2016/4/5 21:02:09  421人阅读 分类: 数据存储 在项目开发当中,我们经常会对一些数据进行本地缓存处理.离线缓存的数据一般都 ...

  5. ios中摄像头/相册获取图片压缩图片上传服务器方法总结

    本文章介绍了关于ios中摄像头/相册获取图片,压缩图片,上传服务器方法总结,有需要了解的同学可以参考一下下.     这几天在搞iphone上面一个应用的开发,里面有需要摄像头/相册编程和图片上传的问 ...

  6. iOS开发之UITableView中计时器的几种实现方式(NSTimer、DispatchSource、CADisplayLink)

    最近工作比较忙,但是还是出来更新博客了.今天博客中所涉及的内容并不复杂,都是一些平时常见的一些问题,通过这篇博客算是对UITableView中使用定时器的几种方式进行总结.本篇博客会给出在TableV ...

  7. TIBCO Jasper Report 中显示图片的方式

    最近在做的项目中,需要输出很多报表类文档,于是选择用jasper来帮助完成. 使用jasper studio的版本是 :TIB_js-studiocomm_6.12.2_windows_x86_64. ...

  8. iOS:实现图片的无限轮播(二)---之使用第三方库SDCycleScrollView

    iOS:实现图片的无限轮播(二)---之使用第三方库SDCycleScrollView 时间:2016-01-19 19:13:43      阅读:630      评论:0      收藏:0   ...

  9. TuSDK 简易使用方法 持有图片对象方式

    TuSDK 为涂图照相应用的SDK,打包后文件大小约为5M,缺点为包比较大,且图片清晰度较差一些,优点为直接可以引用滤镜贴纸,方便易用.   使用方法如下:    1.AppDelegate.m 中加 ...

随机推荐

  1. SVM明确的解释1__ 线性可分问题

    笔者:liangdas 出处:简单点儿,通俗点儿,机器学习    http://blog.csdn.net/liangdas/article/details/44251469 引言: 1995年Cor ...

  2. 禁止Delphi2010检测新版本

    启动Delphi2010后,Delphi2010 总会提示下载更新包,而对于D版用户来说,这个功能可能反而带来麻烦,那么有解决办法吗?答案是肯定的.1. 打开 C:\Documents and Set ...

  3. WPF 中那些可跨线程访问的 DispatcherObject(WPF Free Threaded Dispatcher Object)

    原文 WPF 中那些可跨线程访问的 DispatcherObject(WPF Free Threaded Dispatcher Object) 众所周知的,WPF 中多数对象都继承自 Dispatch ...

  4. 桌面程序的其他实现方式----使用WPF窗体展现网页

    需求 在WPF应用程序中,需要使用到WEB项目的资源,第一时间想到的就是在WPF窗口中,展现WEB项目中的页面,这样子有两点好处:一是,实现简单,不需要在WPF应用程序中实现UI布局和数据绑定:二是, ...

  5. protobuf反射详解

    本文主要介绍protobuf里的反射功能,使用的pb版本为2.6.1,同时为了简洁,对repeated/extension字段的处理方法没有说明. 最初是起源于这样一个问题: 给定一个pb对象,如何自 ...

  6. Android4.0图库Gallery2代码分析(一) 程序整体结构

    Android4.0图库Gallery2代码分析(一) 程序整体结构 Gallery2的用例图分析:Gallery2主要功能是实现本地存储器.MTP存储器和网络存储器中媒体(图像和视频)的浏览.显示和 ...

  7. 浏览器兼容性之ECMAScript

    1 IE中不能操作TR标签的innnerHTML. 2 日期处理函数不一致. (1)IE 8- new Date().getYear()返回的是到当前日期到1900年的差值,FF返回的是当前的年. ( ...

  8. [实时更新]jquery完整版下载

    jquery-2.1.0   注!不再支持IE 6/7/8 直接引用地址:  开发版地址1: <script src="http://code.jquery.com/jquery-2. ...

  9. C#中的MessageBox消息对话框

    关键字:C# MessageBox 消息对话框 在程序中,我们经常使用消息对话框给用户一定的信息提示,如在操作过程中遇到错误或程序异常,经常会使用这种方式给用于以提示.在C#中,MessageBox消 ...

  10. 构建自己的PHP框架(Redis)

    完整项目地址:https://github.com/Evai/Aier Redis 简介 'Redis' 是一个高性能的 'key-value' 数据库,其 'value' 支持 'String'.' ...