如何把 GIF 动图保存到相册?

iOS 的相册是支持保存 GIF 和 APNG 动图的,只是不能直接播放。用 [ALAssetsLibrary writeImageDataToSavedPhotosAlbum:metadata:completionBlock] 可以直接把 APNG、GIF 的数据写入相册。如果图省事直接用 UIImageWriteToSavedPhotosAlbum() 写相册,那么图像会被强制转码为 PNG。

将 UIImage 保存到磁盘,用什么方式最好?

目前来说,保存 UIImage 有三种方式:1.直接用 NSKeyedArchiver 把 UIImage 序列化保存,2.用 UIImagePNGRepresentation() 先把图片转为 PNG 保存,3.用 UIImageJPEGRepresentation() 把图片压缩成 JPEG 保存。

实际上,NSKeyedArchiver 是调用了 UIImagePNGRepresentation 进行序列化的,用它来保存图片是消耗最大的。苹果对 JPEG 有硬编码和硬解码,保存成 JPEG 会大大缩减编码解码时间,也能减小文件体积。所以如果图片不包含透明像素时,UIImageJPEGRepresentation(0.9) 是最佳的图片保存方式,其次是 UIImagePNGRepresentation()。

UIImage 缓存是怎么回事?

通过 imageNamed 创建 UIImage 时,系统实际上只是在 Bundle 内查找到文件名,然后把这个文件名放到 UIImage 里返回,并没有进行实际的文件读取和解码。当 UIImage 第一次显示到屏幕上时,其内部的解码方法才会被调用,同时解码结果会保存到一个全局缓存去。据我观察,在图片解码后,App 第一次退到后台和收到内存警告时,该图片的缓存才会被清空,其他情况下缓存会一直存在。

我要是用 imageWithData 能不能避免缓存呢?

不能。通过数据创建 UIImage 时,UIImage 底层是调用 ImageIO 的 CGImageSourceCreateWithData() 方法。该方法有个参数叫 ShouldCache,在 64 位的设备上,这个参数是默认开启的。这个图片也是同样在第一次显示到屏幕时才会被解码,随后解码数据被缓存到 CGImage 内部。与 imageNamed 创建的图片不同,如果这个图片被释放掉,其内部的解码数据也会被立刻释放。

怎么能避免缓存呢?

1. 手动调用 CGImageSourceCreateWithData() 来创建图片,并把 ShouldCache 和 ShouldCacheImmediately 关掉。这么做会导致每次图片显示到屏幕时,解码方法都会被调用,造成很大的 CPU 占用。
2. 把图片用 CGContextDrawImage() 绘制到画布上,然后把画布的数据取出来当作图片。这也是常见的网络图片库的做法。

我能直接取到图片解码后的数据,而不是通过画布取到吗?

1.CGImageSourceCreateWithData(data) 创建 ImageSource。
2.CGImageSourceCreateImageAtIndex(source) 创建一个未解码的 CGImage。
3.CGImageGetDataProvider(image) 获取这个图片的数据源。
4.CGDataProviderCopyData(provider) 从数据源获取直接解码的数据。
ImageIO 解码发生在最后一步,这样获得的数据是没有经过颜色类型转换的原生数据(比如灰度图像)。

如何判断一个文件的图片类型?

通过读取文件或数据的头几个字节然后和对应图片格式标准进行比对。我在这里写了一个简单的函数,能很快速的判断图片格式。

怎样像浏览器那样边下载边显示图片?

首先,图片本身有 3 种常见的编码方式:

  

第一种是 baseline,即逐行扫描。默认情况下,JPEG、PNG、GIF 都是这种保存方式。
第二种是 interlaced,即隔行扫描。PNG 和 GIF 在保存时可以选择这种格式。
第三种是 progressive,即渐进式。JPEG 在保存时可以选择这种方式。
在下载图片时,首先用 CGImageSourceCreateIncremental(NULL) 创建一个空的图片源,随后在获得新数据时调用
CGImageSourceUpdateData(data, false) 来更新图片源,最后在用 CGImageSourceCreateImageAtIndex() 创建图片来显示。

你可以用 PINRemoteImage 或者我写的 YYWebImage 来实现这个效果。SDWebImage 并没有用 Incremental 方式解码,所以显示效果很差。

转载于:https://www.cnblogs.com/crash-wu/p/5104380.html

iOS 处理图片的一些小 Tip相关推荐

  1. 小tip: 使用CSS将图片转换成黑白(灰色、置灰)[转]

    小tip: 使用CSS将图片转换成黑白(灰色.置灰) 这篇文章发布于 2012年08月19日,星期日,20:41,归类于 css相关, SVG相关. 阅读 159943 次, 今日 146 次 by ...

  2. ios手机 苹果手机 在小程序里面长按图片 后 点击事件失效问题

    问题:ios手机 苹果手机 在小程序里面长按图片后,图片悬浮,然后点击事件都失效的问题. 解决办法:在img图片标签里加 css属性 -webkit-touch-callout: none; .如果是 ...

  3. 关于SCI他引、自引、他引统计的小tip

    关于SCI他引.自引.他引统计的小tip 论文引用 论文引用包括 **如何判断一篇论文/期刊是否为SCI论文呢?** 如何判断一个期刊是否被SCI收录 论文引用整理 其他 总结 论文引用 论文的引用最 ...

  4. 基于uniapp开发DiscuzQ社区的ios和安卓、小程序H5

    Discuz!Q生成多端小程序和APP. 基于DiscuzQ!3.0版本API,使用UNIAPP框架重构,暂时没有做登录互动和支付相关功能. 基于uniapp开发DiscuzQ社区的ios和安卓.小程 ...

  5. 苹果阻止升级插件ios12_苹果推出iOS 14,具有小部件和多项应用程序升级

    苹果阻止升级插件ios12 It's safe to say that iOS 13 has been troublesome at best. The latest iPhone software ...

  6. ios xcode 定时器_iOS小技巧总结,绝对有你想要的

    在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新. UITableView的Group样式下顶部空白处理//分组列表头部空白处理 UIView *view = [[UIView al ...

  7. ios 输入话题_其实,iPhone原装APP很好用 篇一:iOS输入法17个小技巧,开启你iPhone原装键盘输入新篇章...

    其实,iPhone原装APP很好用 篇一:iOS输入法17个小技巧,开启你iPhone原装键盘输入新篇章 2017-12-13 15:45:15 600点赞 2104收藏 316评论 一.其实ios原 ...

  8. 安卓前行小Tip(4)——查看安卓手机分辨率

    安卓前行小Tip(4)--查看安卓手机分辨 (1)一般方法:从设置-关于手机里面,有的机型不会显示,有的可以(2)通用方法:用手机自带截屏,然后到相册里面看这个照片的详细信息,直接显示分辨率X*X或者 ...

  9. 【问题排查与解决】ios调起微信小程序支付失败

    ios调起微信小程序支付SDK失败 场景 排查方向(1. 支付规范导致2. 参数缺少导致3. sdk版本问题) 微信小程序支付规范 解决方式 调起微信小程序参数问题(需要传入当前小程序的appId) ...

  10. iOS 10 个实用小技巧(总有你不知道的和你会用到的)

    在开发过程中我们总会遇到各种各样的小问题,有些小问题并不是十分容易解决.在此我就总结一下,我在开发中遇到的各种小问题,以及我的解决方法.比较普遍的我就不再提了,这里主要讲一些你可能不知道的(当然,也有 ...

最新文章

  1. C++/C++11中std::queue的使用
  2. linux qt5.7下打地鼠源程序,基于QT的打地鼠游戏
  3. 下一次工业革命:计算生物学与生物平台
  4. 免费的文本分析 文本挖掘软件工具
  5. 以后版本网卡命名规则
  6. Chrome 插件开发-桌面通知设置实战演示,设置通知显示、存在时间
  7. python 分离整数与小数_Python编程:离不开算术运算符的顺序结构
  8. python while一定要提供循环次数吗_Python语法之选择和循环(if、while)
  9. .NET Core 中有等价的 HttpContext.Response.Cache 吗?
  10. C++ 11 深度学习(九)C++文件IO
  11. (转)在Myeclipse中查看android源码就是这么easy
  12. c++ 课程设计之车票管理系统
  13. Git学习(二)远程仓库建立与克隆
  14. vue-router配置
  15. 开源实时视频码流分析软件:VideoEye
  16. sort函数(c语言排序)
  17. 华为5500网络限流配置_华为USG防火墙综合解决方案
  18. opencv矩形轮廓顶点的具体位置确定
  19. 一台计算机只能注册一台sql,局域网中的一台电脑为啥连接不到另一台电脑中的SQL远程数据库...
  20. 可怜小女孩,模仿电视上吊死亡

热门文章

  1. 按顺序读取选中的复选框
  2. Layer success 层弹出后的成功回调方法
  3. PHP 保留 n 位小数
  4. PHP中cURL的curl_getinfo函数返回的CURLINFO_HTTP_CODE是0
  5. MAC编译ffmpeg
  6. 上下五千年,人口十几亿。在这遇见你,缘份真神奇
  7. 缺少链接库报错:ld: symbol(s) not found for architecture x86_64
  8. /usr/include/openssl/des.h:91:9: error: unknown type name ‘DES_LONG’ DES_LONG deslong[2];
  9. 使用cJSON产生json字串
  10. 一天到晚都在转笔,不需要写代码、调试,用眼看就行了?