一口气说明白 CIImage 、CGImageRef、UIIma
CIImage
通过苹果官方文档解释:
CIImage 可以理解为结合处理 Core Image Classes的一些类:如CIFiter(滤镜处理类)、CIContext(分析评估图像的一个上下文环境)、CIVector(先理解矩阵向量,后面研究) 和 CIColor, 可以通过各种渠道去创建CIImage,如Quartz 2D images 、core video image buffer(CVImageBufferRef,这玩意我在用iOS系统捕捉画面帧的一个代理里面见过,具体也不太记得),URL 对象(直接加载图片路径)以及NSData 对象
尽管CIImage 关联着着UIImage的数据,但是它不是UIImage,可以把它理解成UIImage 的食谱(这句话我理解成CIImage 有存放UIImage 所需的所有信息,但是就是不用来直接显示图片,类似UIImage 信息记录的容器),想显示CIImage 最终还是要转成UIImage 然后再UIImageView 上显示。
CIContext 和CIImage 对象是不可变对象,因此是线程安全的,可以在多个线程用GPU或者CPU 的CIContext(分析评估图像的一个上下文环境) 去渲染CIImage 对象,但是不能被CIFilter 用,因为CIFilter 是可变对象,意味着是线程不安全的,如果你的app 在多线程使用CIFilter ,那么最好在每个线程都创建一个CIFilter ,否则会遇到一些难以解释的情况。
核心图像还提供自动调整方法。这些方法分析图像中常见的缺陷,并返回一组过滤器来纠正这些缺陷。滤镜是预先设置的值,通过改变肤色、饱和度、对比度和阴影的值来提高图像质量,并用于消除红眼或其他由闪光灯引起的伪影。
CGImageRef:
typedef struct CF_BRIDGED_TYPE(id)CGImage*CGImageRef; 系统文件定义
这样可以理解CGImageRef 其实就是 CGImage 的结构体指针,那么CGImage 又是啥:
直接看它官方文档定义解释:
Summary
The CoreGraphics image object this image was created from, if applicable.
Declaration
@property(nonatomic, readonly) CGImageRef CGImage;
Discussion
If this image was created using the initWithCGImage: or initWithContentsOfURL:initializer, this property’s value is the CGImageRef object that provides the image’s underlying image data. Otherwise, this property’s value is nil—in this case you can obtain a CoreGraphics image by rendering the image with the CIContextcreateCGImage:fromRect: method.
大概意思就是 是核心绘图的image 对象,为了方便记忆,我直接理解成CoreGraphics层使用的图像对象的类。
UIImage: 我觉得这货就不用解释了吧。
总结一下:CIImage 存储了UIImage 的信息,但是它不是用来在上层UI 显示,而是转化成UIImage 来显示,
CGImageRef 理解成 CGImage ,核心绘图那一层的图像类,
UIImage 最贴近我们的图像处理类,
它们三个可以互相转换:
CIContext *context = [CIContext contextWithOptions:nil];
qrImage 就是CIImage 的实例
CGImageRef bitmapImage = [context createCGImage:qrImage fromRect:frame];
UIImage *image = [UIImage imageWithCGImage:bitmapImage];
分析完毕 搞定!!