设备(显示器,打印机,扫描仪,相机)有着不处理颜色相同的方式,每个都有自己的颜色范围。在一个设备上产生的颜色可能无法在另一个设备上产生。
为了高效的利用Quartz2D方法处理颜色,你需要足够熟悉颜色管理概述:Color Management Overview.这里面详细介绍了颜色的概念,色值,设备特性以及设备色彩空间,颜色匹配问题,渲染意向,颜色管理模块,还有ColorSync.
本章,你将学习Quartz2D是如何表示颜色和色彩空间的,以及alpha组分是到底是什么。本章也将讨论:
(1)Create color spaces
(2)Create and set colors
(3)Set rendering intent
About Color and Color Spaces 关于色彩空间
Quartz中的一个颜色代表着色值。色彩空间是用来解释颜色信息的,如果没有色彩空间,色值是没有意义的。下表4-1展示了所有颜色。但是如果不知道色彩空间以及每个色彩空间允许的变化范围,你不可能了解到每种颜色代表着什么。
HSB:组分 有 色调 饱和度 以及亮度
RGB:组分有 红 绿 蓝
CMYK:组分有 青 品红 黄色 黑色
BGR:组分有蓝色 绿色 红色
The Alpha Value 透明度
透明度也是图形状态的一部分;
在正常模式下,默认的图形状态,Quartz将源颜色与目表颜色通过下面的公式来计算透明度:destination = (alpha * source) + (1 - alpha) * destination
您可以提供一个α值作为接受颜色的所有例程的最后一个颜色分量,也可以设置全局透明度使用CGContextSetAlpha方法。需要注意的是当你都设置了,全局透明度要乘以 透明度。
为了使一个页面完全透明,你可以明确的清除上下文的透明度使用CGContextClearRect方法,当你的上下文是一个窗口或者一个位图的时候。当你想为一张图片创建一个透明的遮盖时或者使一个窗口的背景透明都可以这样做。
Creating Color Spaces 创建颜色空间
Quartz 支持用于设备独立的颜色空间的颜色管理系统的标准颜色空间,也支持通用的,索引,模式颜色空间。设备独立的颜色是可以移植的。设备独立的的颜色空间被用来从一个设备到一个设备之间颜色的转换。在设备独立的颜色空间中的颜色在不同的设备上是相同的,在设备允许的范围内。基于这个原因,设备独立的颜色空间是展示颜色的最佳选择。
应用中如果有精确的颜色要求应该使用设备独立的颜色空间。一个常见的设备独立空间是通用的颜色空间。通用的颜色空间让操作系统为您的应用程序提供最佳的颜色空间。绘制的和你打印的看起来是一样的。
切记:ios 不支持设备独立或者通用的色彩空间,ios 应用必须使用device color spaces。
所以设备独立或者通用的色彩空间就不多说明了。说下ios 使用的设备色彩空间。
Creating Device Color Spaces 创建设备色彩空间。
设备的颜色空间主要是被iOS应用使用是因为其他的不可用。在多数情况下Mac OS X使用的是通用的而不是创建设备色彩空间。然而一些Quartz程序期望具有设备色彩空间的图形。举个例子,你可以调用CGImageCreateWithMask然后指定一个图像作为遮盖,图像必须用设备灰色空间定义。可以用来创建一个设备颜色空间的方法有以下几个:
CGColorSpaceCreateDeviceGray for a device-dependent grayscale color space. //灰度颜色空间
CGColorSpaceCreateDeviceRGB for a device-dependent RGB color space.//RGB颜色空间
CGColorSpaceCreateDeviceCMYK for a device-dependent CMYK color space.//CMYK颜色空间
Setting and Creating Colors 设置并且创建颜色
Quartz提供了一些列可以方法可以设置填充颜色, 描边颜色,颜色空间以及透明度,这些参数都是图形状态的一部分,这就意味着你设置一次的时候,接下来的这些设置会一直保存直到你设置为别的值。下图4-4中,左边的是用CMYK填充的蓝色,右边是用RGB填充的颜色。你会看到很大的不同在这两种颜色之间。理论上是相同的,但只有在RGB颜用于RBG的设备同时CMYK颜色用于CMYK的设备才会出现相同的效果。
你可以使用方法CGContextSetFillColorSpace和CGContextSetStrokeColorSpace去填充或者描边颜色空间,你也可以使用下表中的便利方法中的一个,这些方法都是设备颜色空间。
你可以指定描边或者填充颜色的色值用来进行描边或者填充。例如,一个完全饱和的红色可以指定为四个数字的数组:(1,0,0,1)。前三个指定纯红色,没有绿色和蓝色,最后一个表示透明度。
当你在应用程序中要循环利用这些颜色的时候,最便捷的就是创建一个CGColor对象进行描边或者填充。CGColor你只需要传递一个参数给这个两个方法:CGContextSetFillColorWithColor和CGContextSetStrokeColorWithColor,你可以保持这个对象当你需要使用它的时候。你可以提高应用程序的执行能力通过使用CGColor。你可以创建一个CGColor对象通过调用方法CGColorCreate,传入一个CGColorspace对象和一组浮点数用来指定色值。最后一个组分指定透明度。
Setting Rendering Intent 设置渲染意向
绘制意图指定了Quartz如何从原色空间映射到图形上下文的颜色空间。如果没有显式设置渲染意图,Quartz使用相对比色的渲染意图除了位图。Quartz会使用感知渲染的意图。
为了设置渲染意图,调用CGContextSetRenderingIntent,同时传入一个上下文参数和下面的一个常数。
kCGRenderingIntentDefault.//使用上下文默认的渲染意图
kCGRenderingIntentAbsoluteColorimetric.//将输出设备色域以外的颜色映射到最接近匹配于输出设备色域内的颜色,这可以产生一个裁剪效果,其中在色域的图形上下文的两个不同的颜色值被映射在输出设备的色域,是相同的颜色。当上下文是源地和目的地的色域时,这是最佳的选择。
kCGRenderingIntentRelativeColorimetric.//相对比色转换了所有的颜色去解释上下文白点和输出设备白点 之间的差异。
kCGRenderingIntentPerceptual.//通过压缩图形上下文的色域以适应在输出设备的色域范围,保留颜色之间的视觉关系。感知意图对于照片和其他复杂的图片是适合的。
kCGRenderingIntentSaturation.//当将颜色转换成输出设备的色域时,保持颜色的相对饱和值。其结果是一个明亮的,饱和的颜色的图像。饱和意图对于降低图像的低等细节是适合的,比如展示图标和图形。