问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

UIColor,CGColor,CIColor三者间的区别和联系

发布网友 发布时间:2022-04-30 20:11

我来回答

1个回答

热心网友 时间:2022-06-30 20:51

一、UIColor
UIColor是UIKit中存储颜色信息的一个重要的类,一个UIColor对象包含了颜色和透明度的值,它的颜色空间已经针对IOS进行了优化。UIColor包含了一些类方法用于创建一些最常见的颜色,如白色,黑色,红色,透明色等,这些颜色的色彩空间也不尽相同(白色和黑色是kCGColorSpaceDeviceGray,红色的色彩空间是kCGColorSpaceDeviceRGB)。
此外UIColor还有两个重要的属性:一个是CGColor,一个是CIColor(5.0之后添加)。这两个属性就可以把UIColor,CGColor,CIColor三个对象联系起来了,后面会详细介绍这三者之间的转换。
二、CGColor
CGColor主要用于CoreGaphics框架之中,CGColor其实是个结构体,而我们通常在使用的CGColor的时候使用的是它的引用类型CGColorRef。CGColor主要由CGColorSapce和Color Components两个部分组成,同样的颜色组成,如果颜色空间不同的话,解析出来的结果可能会有所不同。这就像我们在处理图片数据的时候,如果把RGBA格式当成BGRA格式处理的结果可想而知。在Quartz 2D中CGColor常用来设置context的填充颜色,设置透明度等。
1、如何创建一个CGColor,最常用的函数是CGColorCreate,该函数有两个参数:
1) colorspace,指定CGColor对应的颜色空间,Quartz就会retain该对象,因此调用完之后你就可以安全的释放该对象。
2) components,一个CGFloat的数组,该数组的元素个数是指定色彩空间包含的颜色分量数n,加上对应的alpha值。 
该函数该返回一个新创建的CGColorRef,当我们不再使用该对象的时候使用CGColorRelease函数释放该对象。
2、获取CGColor的数据
在我们创建的时候传入两个重要的参数进去,当我们获取到了CGColorRef以后当然就可以拿到对应的ColorSpace以及Components。
1) 获取ColorSpace
通过CGColorGetColorSpace函数我们可以获取到当前CGColorRef对应的ColorSpace,该函数只接受一个参数就是你要获取ColorSpace的CGColorRef。下面请看一个简单的例子:
CGColorRef cgColor =[UIColor redColor].CGColor; CGColorSpaceRef colorSpace =CGColorGetColorSpace(cgColor); NSLog(@"color space: %@", colorSpace);
2) 获取Color Components
要获取到CGColorRef对应的颜色值,我们需要用到CGColorGetNumberOfComponents和CGColorGetComponents两个函数。我们先来看看两个函数的函数原型:
size_t CGColorGetNumberOfComponents ( CGColorRef color );
constCGFloat *CGColorGetComponents ( CGColorRef color );
第一个函数是获得CGColorRef的中包含的颜色组成部分的个数,第二个函数就是获取实际的颜色组成部分的数组,下面看一个小例子:
NSUInteger num =CGColorGetNumberOfComponents(cgColor);
constCGFloat *colorComponents =CGColorGetComponents(cgColor);
for(inti = 0; i < num; ++i) { NSLog(@"color components %d: %f", i, colorComponents[i]); }
三、CIColor
CIColor主要是用于和Core Image框架中其他类,比如CIFilter,CIContext以及CIImage。今天我们主要关心的颜色值部分,CIColor中颜色值的范围是0.0-1.0之间,0.0代表该颜色分量为最小值,1.0代表改颜色分量为最大值。其中alpha值的范围也是0.0到1.0之间,0.0代表全透明,1.0代表完全不透明,同时CIColor的颜色分量通常都是没有乘以alpha值。
我们可以使用initWithCGColor:函数,通过CGColor创建一个CIColor。其中传入的CGColorRef对象可以使任何任何颜色空间,但是Core Image框架会在传入filter kernel之前把所有的颜色空间转换到core image工作颜色空间。core image工作颜色空间使用三个颜色分量加上一个alpha分量组成(其实就是kCGColorSpaceDeviceRGB),后面的例子中我们验证这一点。
四、UIColor,CGColor,CIColor的区别和联系
1、UIColor的两个属性CGColor,CIColor
UIColor的CGColor总是有效的,不管它是通过CGColor,CIColor,还是其他方法创建的,CGColor属性都总是有效的;但是CIColor属性就不总是有效的,只有当UIColor是通过CIColor创建的时候,他才是有效的,否则访问该属性将会抛出异常,下面照旧来一个小例子:
//test init uicolor with CGColor
UIColor *color =[UIColor colorWithCGColor:[UIColor whiteColor].CGColor];
//CGColor property is always valid
NSLog(@"CGColor from UIColor %@", color.CGColor);
//don't use CIColor property
//This property throws an exception if the color object was not initialized with a Core Image color.
NSLog(@"CIColor from UIColor %@", color.CIColor); //crush
2、UIColor使用CGColor初始化
当UIColor使用CGColor初始化的时候,所有CGColorRef包含的信息,都会被原封不动的保留,其中就包括Color space,而且通过下面的小例子我们还可以看到如果使用CGColor初始化UIColor的时候,UIColor其实是直接保留了一份这个CGColorRef对象。例子如下:
//test kCGColorSpaceDeviceCMYK
CGColorSpaceRef cmykSpace =CGColorSpaceCreateDeviceCMYK(); CGFloat cmykValue[] = {1, 1, 0, 0, 1}; //blue
CGColorRef colorCMYK =CGColorCreate(cmykSpace, cmykValue); CGColorSpaceRelease(cmykSpace); NSLog(@"colorCMYK: %@", colorCMYK);
//color with CGColor, uicolor will just retain it
UIColor *color =[UIColor colorWithCGColor:colorCMYK]; NSLog(@"CGColor from UIColor: %@", color.CGColor);
3、UIColor使用CIColor初始化
下面我们讨论一下当使用CIColor来初始化一个UIColor的时候,再去访问UIColor的CGColor属性的时候,我们会发现CGColor的color Space和设置CIColor的color space的是不完全一样的,在这个过程中CIColor会为我们做一个转换。下面我们分别看看使用kCGColorSpaceDeviceGray,kCGColorSpaceDeviceRGB,kCGColorSpaceDeviceCMYK三种颜色空间来初始化一个CIColor的时候,再去使用该CIColor去初始化一个UIColor,然后在去访问其CIColor属,CGColor属性,查看颜色空间并打印颜色信息。
1) 使用kCGColorSpaceDeviceGray初始化CIColor
首先看代码:
//test kCGColorSpaceDeviceGray
NSLog(@"CGColor white color:%@", [UIColor whiteColor].CGColor); CIColor *ciColor =[CIColor colorWithCGColor:[UIColor whiteColor].CGColor]; NSLog(@"cicolor: %@", ciColor); NSLog(@"cicolor colorspace: %@", ciColor.colorSpace); color =[UIColor colorWithCIColor:ciColor]; NSLog(@"color %@", color);
//Core Image
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
你觉得hx100在长焦机中怎样?处于什么水平? 索尼DSC-HX100显示功能 美的kfr-51lw/ y- pa1是什么故障代码 索尼DSC-HX100V基本参数 索尼DSC-HX100显示功能 索尼DSC-HX100主要参数 金龙鱼深海鱼油好不好? Y一60C81显示E5什么故障? 索尼DSCHX100质量如何 索尼DSC-HX100存储性能 Sedex/SMETA 是什么意思 求助 我们家自己饲养的狗一直用铁链子栓着,因为男孩子的挑逗,招惹,把其咬伤,我们该怎么办 宠物狗咬了人,路口有警示牌,狗是栓了铁链的,主人有责任吗? 计算机用户密码的设置 遛狗时我家小狗总咬拴狗绳怎么办?已经要折三根了 手被栓狗的链子划伤了一个小口,请问用不用打狂犬疫苗 你对曹操专车的司机满意吗? 杜高犬几个月 栓大铁链子 栓大狼狗要用几号大的铁链 smeta验厂是什么 北京市八十岁高龄补贴如何使用? 济南怎样使用新能源补贴账户的金额 大学生创业如何享受或者使用补贴政策? 慢病补贴怎么使用 北京市失能补贴怎么用?可以买吃的吗? 新型学徒制补贴可以使用在哪些方面? 北京失能老人每月补助600怎么用 百度补贴怎么用 发放补贴使用什么意思 斗鱼直播画面为啥其他人能写 用户名密码怎么设置 为何我的电脑输完密码打不开,说无法加载用户配置? 四年级作文我最敬佩的人清洁工 我最敬佩的人清洁工二百字作文 我爱你,中国的汉字 我最敬佩的一个人清洁工人有动作,语言,外貌,神态,心理描写400字 我白细胞低是怎么回事呢,最近 求各国“我爱你”的语言和怎样读! 我最敬佩的一个人清洁工 我最尊敬的人清洁工(结尾) server用户密码如何设置 用一百种不同语言写“我爱你”!!!(标名是啥语) 我爱你。。 好用的视频截屏录制软件 我爱你用一百种语言文字怎么写? 白细胞偏低的原因? 可以对游戏进行录像并截图的软件有哪些? 、Auto CAD2012的工作界面包括娜几个部分? cad2012命令栏字体很小 天正2014打开cad2012没有命令栏和各种工具栏,求解!!