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中navigationBar上 按钮图片设置frame无效 不受约束 产生错位问题 解决
问题描述: 正常样式: 在iOS 11 iPhone X上显示效果: 观察顶部navBar上的左侧按钮 在ios 11 上 这个按钮的图片不受设置的尺寸约束,按其真实大小展示,造成图片错位,影响界 ...
- iOS开发中的4种数据持久化方式【二、数据库 SQLite3、Core Data 的运用】
在上文,我们介绍了ios开发中的其中2种数据持久化方式:属性列表.归档解档.本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运 ...
- iOS - 选取相册中iCloud云上图片和视频的处理
关于iOS选取相册中iCloud云上图片和视频 推荐看:TZImagePickerController的源码,这个是一个非常靠谱的相册选择图片视频的库 .当然也可以自己写 如下遇到的问题 工作原因, ...
- IOS开发数据存储篇—IOS中的几种数据存储方式
IOS开发数据存储篇—IOS中的几种数据存储方式 发表于2016/4/5 21:02:09 421人阅读 分类: 数据存储 在项目开发当中,我们经常会对一些数据进行本地缓存处理.离线缓存的数据一般都 ...
- ios中摄像头/相册获取图片压缩图片上传服务器方法总结
本文章介绍了关于ios中摄像头/相册获取图片,压缩图片,上传服务器方法总结,有需要了解的同学可以参考一下下. 这几天在搞iphone上面一个应用的开发,里面有需要摄像头/相册编程和图片上传的问 ...
- iOS开发之UITableView中计时器的几种实现方式(NSTimer、DispatchSource、CADisplayLink)
最近工作比较忙,但是还是出来更新博客了.今天博客中所涉及的内容并不复杂,都是一些平时常见的一些问题,通过这篇博客算是对UITableView中使用定时器的几种方式进行总结.本篇博客会给出在TableV ...
- TIBCO Jasper Report 中显示图片的方式
最近在做的项目中,需要输出很多报表类文档,于是选择用jasper来帮助完成. 使用jasper studio的版本是 :TIB_js-studiocomm_6.12.2_windows_x86_64. ...
- iOS:实现图片的无限轮播(二)---之使用第三方库SDCycleScrollView
iOS:实现图片的无限轮播(二)---之使用第三方库SDCycleScrollView 时间:2016-01-19 19:13:43 阅读:630 评论:0 收藏:0 ...
- TuSDK 简易使用方法 持有图片对象方式
TuSDK 为涂图照相应用的SDK,打包后文件大小约为5M,缺点为包比较大,且图片清晰度较差一些,优点为直接可以引用滤镜贴纸,方便易用. 使用方法如下: 1.AppDelegate.m 中加 ...
随机推荐
- httpclient htmlunit下载单个文件
httpclient public class Download { public static void main(String[] args) throws ClientProtocolExcep ...
- WinFrom - 打开一个窗体关闭另一个窗体
在写Winform程序的时候,经常会遇到“打开一个新的窗体然后关闭本窗体”之类的问题.最常见的就是登陆界面和主窗体了.而最常见的处理方法就是表单判断正确后 new MainForm().Show(); ...
- node 设置自动启用定时任务控件 node-schedule
[转]Quartz中时间表达式的设置-----corn表达式 时间格式: <!-- s m h d m w(?) y(?) -->, 分别对应: 秒>分>小时>日&g ...
- UVA 1347(POJ 2677) Tour(双色欧几里德旅行商问题)
Description John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane a ...
- Java实现查找二叉树&C++的做法
写了个Java的查找二叉树,用递归做的,不用递归的还没弄出来.先贴一下.回头再研究. BTreeTest.java: public class BTreeTest{ class Node{ Node ...
- SQL中关键字的执行顺序
作为一个SQL新手,看到每种不熟悉的关键字时已经够迷茫了,可往往见到的语句关键字顺序还是各种各样,太难理解了.网上搜索了两篇文章,总结一下: 关于Sql关键字SELECT FROM GROUP ORD ...
- 局部QEventLoop帮助QWidget不消失(也就是有一个局部事件循环始终在运行,导致程序被卡住那里,但仍可以接受事件。说白了就是有一个while语句死活不肯退出,直到收到退出信号)
熟悉的陌生人 Qt 是事件驱动的,所以当你用Qt的时候,几乎时时刻刻和 QEventLoop 打交道.,只是你可能没有意识到: QCoreApplicaton::exec() QApplication ...
- Matlab 版本和支持问题
从 Matlab 2013版本开始,matlab 将可以直接调用 gpu 进行并行计算,而不再需要安装 GPUmat 工具箱: 随机化: old:rand(")/randn(", ...
- 标准差standard deviation和标准错误standard error你能解释一下
by:ysuncn(欢迎转载,请注明原创信息) 什么是标准差(standard deviation)呢?依据国际标准化组织(ISO)的定义:标准差σ是方差σ2的正平方根:而方差是随机变量期望的二次偏差 ...
- 从加载DLL的中获取放置于Resources文件夹中资源字典的几种方法
原文:从加载DLL的中获取放置于Resources文件夹中资源字典的几种方法 主程序 为 Main_Test.exe 被加载的DLL 为 Load_Test.dll 此DLL 中 有一个 文件夹Re ...