颜色与颜色空间

在现代计算机图形学中,显示在屏幕上的颜色数据都会保存,并遵循色彩模型,也就是色彩空间,将显示生活中的颜色以计算机能够理解的数值表示出来。iOS就是以红绿蓝+透明度来表示颜色。在iOS中这些数组都是在0.0 ~ 1.0之间。

RGB色彩模型

红绿蓝 代表加法三原色,即(RGB色彩模型)。以不同的比例混合三种颜色,会生成一些列不同的颜色,统称为色域(gamut)。

RYB色彩模型

以前学过红黄蓝,称之为减法三原色,即(RYB色彩模型)。它的局限性是色域非常有限,还很难用数学方式来表示。

更多色彩模型

不同的设备处理颜色的方式是不同的(比如显示器,打印机,摄像头)。比如HSV、HSL。甚至RGB模型也有不同的版本变化。

Quartz中的颜色

除了RGB外,Quartz还使用了一个alpha颜色元素。他表示不透明度。所以使用了alpha的色彩模型成为RGBA色彩模型。

颜色是绘图的一个重要组成,要理解颜色在iOS上的实现机制也非常重要,UIKit提供了UIColor来表示颜色,在Quartz中不直接使用UIColor对象,因为Quartz需要一个CGColor。 但我们可以通过UIColor实例的CGColor的属性来获取一个CGColor的引用。

1
CGContextSetFillColorWithColor(context, UIColor.redColor.CGColor);

Objective-C中可以直接使用dot语法对类方法进行访问。

1
[UIColor redColor] -> UIColor.redColor

颜色与颜色空间

Quartz中的颜色是用一组值来表示, 例如:{red: 0.1, green: 0.2, blue: 1.0, alpha: 1.0}。而颜色空间用于解析这些颜色信息

颜色空间

Quartz支持颜色空间、索引颜色空间等等,但是在iOS中必须使用设备颜色空间

创建设备依赖颜色空间

1
2
3
CGColorSpaceCreateDeviceGray:创建设备依赖灰度颜色空间
CGColorSpaceCreateDeviceRGB:创建设备依赖RGB颜色空间
CGColorSpaceCreateDeviceCMYK:创建设备依赖CMYK颜色空间

创建颜色

我们可以使用CGColorCreate来创建颜色。

1
2
3
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
const CGFloat components[] = {1.0, 0.0, 0.0, 0.6};
CGColorRef color = CGColorCreate(colorSpace, components);

内存管理

Quartz中既然使用了create那么就需要手动管理内存,所以需要释放颜色空间与颜色

1
2
CGColorRelease (color);
CGColorSpaceRelease (colorSpace);

UIColor

UIColor是UIKit中存储颜色信息的类。它的颜色空间已经针对iOS进行了优化。它有一些类方法可以直接创建常见的颜色,白色、黑色等。UIColor还有CGColor与CIColor两个重要属性。

CGColor

CGColor 是CoreGraphics框架中的。由颜色空间CGColorSpaceRef与Color Components组成。颜色空间不一样,显示的最终颜色也不一样。

CIColor

CIColor主要用于CoreImage框架中。在iOS5被加入到UIColor中。

UIColor、CGColor、CIColor三者之间的区别

CGColor 一直都可以通过 UIColor来获取到,但是CIColor不一样会有值,可能为空。

坚持原创技术分享,您的支持将鼓励我继续创作!