UIImage知识点汇总

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UIImage知识点汇总相关的知识,希望对你有一定的参考价值。

UIkit框架中,UIImage对象是ios中用来显示图像数据的高级接口。我们可以从文件,NSDataQuartz图片对象中创建UIImage对象。可以说这个类是我们接触频率非常高的一个类。
UIImage的不可变性
UIImage对象是不可变的,所以一旦创建后,我们就不能再改变它的属性。这也就意味着,我们只能在初始化方法中提供属性值或依赖于图片自身的属性值。同样,由于其不可变,所以在任何线程中都可以安全地使用它。
如果我们想修改UIImage对象的一些属性,则可以使用便捷方法和自定义的参数值来创建图像的一份拷贝。
另外,由于UIImage对象是不可变的,所以它没有提供访问底层图片数据的方法。不过我们可以使用UIImagePNGRepresentationUIImageJPEGRepresentation方法来获取包含PNGJPG格式的数据的NSData对象。如下代码所示:
let image = UIImage(named: "swift");
let imageData:NSData? = UIImageJPEGRepresentation(image!, 1.0)
创建UIImage对象
对于一个UIImage对象来说,它的数据源主要有以下几种:
文件:我们可以使用init(contentsOfFile:)方法来从指定文件中创建对象。
纯图片数据(NSData):如果在内存中有图片的原始数据(表示为NSData对象),则可以使用init(data:)来创建。需要注意的是这个方法会对象图片数据做缓存。
CGImage对象:如果我们有一个CGImage对象,则可以使用init(CGImage:)init(CGImage:scale:orientation:)创建UIImage对象。
CIImage对象:如果我们有一个CIImage对象,则可以使用init(CIImage:)init(CIImage:scale:orientation:)创建UIImage对象。
需要注意的是,如果是从文件或者纯图片数据中创建UIImage对象,则要求对应的图片格式是系统支持的图片类型。
对于Objective-C来说,UIImage对象也提供了这些初始化方法对应的便捷类方法来创建对象。
内存管理
在实际的应用中,特别是图片类应用中,我们可能需要使用大量的图片。我们都知道,图片通常都是非常占内存的。如果同一时间加载大量的图片,就可能占用大量的系统内存。
为此,Apple采用了一种比较巧妙的策略。在低内存的情况下,系统会强制清除UIImage对象所指向的图片数据,以释放部分内存。注意,这种清除行为影响到的只是图片数据,而不会影响到UIImage对象本身。当我们需要绘制那些图片数据已经被清除的UIImage对象时,对象会自动从源文件中重新加载数据。当然,这是以时间换空间的一种策略,会导致一定的性能损耗。
说到这里,我们不得不提一下init(named:)方法了。可以说我们平时创建UIImage对象用得最多的应该就是这个方法。这个方法主要是使用bundle中的文件创建图片的快捷方式。关于这个方法,有几点需要注意:
缓存:这个方法会首先去系统缓存中查找是否有图片名对应的图片。如果有就返回缓存中的图片;如果没有,则该方法从磁盘或者asset catalog中加载图片并返回,同时将图片缓存到系统中。缓存的图片只有在收到内存警告时才会释放。因此,如果图片的使用频率比较低,则可以考虑使用imageWithContentsOfFile:方法来加载图片,这样可以减少内存资源的消耗。当然,这需要权衡考虑,毕竟读写磁盘也是有性能消耗的,而且现在的高端机内存已经不小了。
多分辨率图片处理:在iOS 4.0后,该方法会根据屏幕的分辨率来查找对应尺寸的图片。即我们使用时,只需要写图片名,而不需要指定是1x, 2x还是3x图,该方法会自己判断。
png图片后缀:在iOS 4.0以后,如果图片是png格式的,则图片文件名不需要附带扩展名。
线程安全性:该方法在iOS 9.0之前并不是线程安全的,在二级线程中调用可能会导致崩溃。在iOS 9.0之后,Apple作了优化处理,将其改为线程安全的方法。为了避免不必要的麻烦,尽量在主线程中调用这个方法。
原文来自:南峰子的技术博客

以上是关于UIImage知识点汇总的主要内容,如果未能解决你的问题,请参考以下文章

什么是ZK-Rollup(零知识汇总)?

pandas知识点汇总

Android 知识点汇总

虚幻四蓝图知识点汇总(Base)

HTML知识点汇总

Android学习指南 — Java知识点汇总