设备(显示器,打印机,扫描仪,相机)不以相同的方式处理颜色; 每个都有自己的颜色范围,设备可以忠实地生产。 在一个设备上生成的颜色可能无法在另一个设备上生成。
要有效地使用颜色和理解Quartz 2D函数以使用颜色空间和颜色,您应该熟悉颜色管理概述中讨论的术语。 该文档讨论了颜色感知,颜色值,设备无关和设备颜色空间,颜色匹配问题,渲染意图,颜色管理模块和ColorSync。
在本章中,您将了解Quartz如何表示颜色和颜色空间,以及alpha组件是什么。 本章还讨论如何:
- 创建颜色空间
- 创建和设置颜色
- 设置渲染意图
关于颜色和颜色空间
Quartz中的颜色由一组值表示。 如果没有指示如何解释颜色信息的颜色空间,这些值是无意义的。 例如,表4-1中的值均表示全强度下的蓝色。 但是,如果不知道每个颜色空间的颜色空间或值的允许范围,则无法知道每组值表示的颜色。
如果你提供错误的颜色空间,你可以得到相当戏剧性的差异,如图4-1所示。 虽然绿色在BGR和RGB颜色空间中被解释为相同,但是红色和蓝色值被翻转。
颜色空间可以具有不同数量的组件。 表中的三个颜色空间有三个分量,而CMYK颜色空间有四个。 值范围是相对于该颜色空间的。 对于大多数颜色空间,Quartz中的颜色值范围从0.0到1.0,其中1.0表示完整强度。 例如,在全部强度的蓝色,在Quartz的RGB颜色空间中指定,具有值(0,0,1.0)。 在Quartz中,color也有一个alpha值,用于指定颜色的透明度。 表4-1中的颜色值不显示Alpha值。
透明度值
alpha值是Quartz用于确定如何将新绘制的对象复制到现有页面的图形状态参数。 在全强度下,新涂的物体是不透明的。 在零强度下,新绘制的对象是不可见的。 图4-2显示了使用alpha值1.0,0.75,0.5,0.1和0.0绘制的五个大矩形。 当大矩形变得透明时,它暴露出一个较小的,不透明的红色矩形。
您可以通过在绘制之前在图形上下文中全局设置alpha值来使页面上的对象和页面本身透明。 图4-3将全局Alpha设置为0.5,默认值为1.0。
在正常混合模式(这是图形状态的默认模式)中,Quartz通过使用公式将源颜色的组件与目标颜色的组件组合来执行Alpha混合:
destination = (alpha * source) + (1 - alpha) * destination
其中源是新涂料颜色的一个组分,而目的地是背景颜色的一个组分。对每个新绘制的形状或图像执行此公式。
对于对象透明度,将alpha值设置为1.0,以指定您绘制的对象应完全不透明;将其设置为0.0以指定新绘制的对象完全透明。介于0.0和1.0之间的Alpha值指定部分透明的对象。您可以将alpha值作为最后一个颜色分量提供给接受颜色的所有例程。您还可以使用CGContextSetAlpha函数设置全局alpha值。请记住,如果设置二者,Quartz将alpha颜色分量乘以全局alpha值。
要允许页面本身完全透明,您可以使用CGContextClearRect函数显式地清除图形上下文的alpha通道,只要图形上下文是窗口或位图图形上下文即可。例如,您可能希望在为图标创建透明蒙版时执行此操作,或者使窗口的背景透明。
创建颜色空间
Quartz支持由颜色管理系统使用的与设备无关的颜色空间的标准颜色空间,并且还支持通用,索引和模式颜色空间。 设备无关的颜色空间以在设备之间可移植的方式表示颜色。 它们用于将颜色数据从一个设备的本地颜色空间到另一个设备的本地颜色空间的交换。 在不同设备上显示时,设备无关颜色空间中的颜色显示相同,只要设备的功能允许。 因此,与设备无关的颜色空间是表示颜色的最佳选择。
具有精确颜色要求的应用程序应始终使用与设备无关的颜色空间。 常见的设备无关颜色空间是通用颜色空间。 通用颜色空间使操作系统为您的应用程序提供最佳的颜色空间。 绘图到显示看起来像打印相同的内容到打印机。
重点:iOS不支持设备无关或通用颜色空间。 iOS应用程序必须使用设备颜色空间。
创建设备无关颜色空间
要创建与设备无关的颜色空间,您需要为Quartz提供特定设备的参考白点,参考黑点和伽玛值。 Quartz使用此信息将颜色从源颜色空间转换为输出设备的颜色空间。
Quartz支持的设备无关颜色空间,以及创建它们的函数有:
- L * a * b *是蒙塞尔彩色符号系统(通过色调,值和饱和度或色度值指定颜色的系统)的非线性变换。该颜色空间将感知的色差与颜色空间中的定量距离匹配。 L *分量表示亮度值,a *分量表示从绿色到红色的值,b *分量表示从蓝色到黄色的值。这种颜色空间被设计为模仿人类大脑如何解码颜色。使用函数CGColorSpaceCreateLab。
- ICC是由国际颜色联盟定义的来自ICC颜色配置文件的颜色空间。 ICC简档定义了设备支持的颜色的色域以及其他设备特性,使得该信息可以用于将一个设备的色彩空间精确地变换到另一个设备的色彩空间。设备的制造商通常提供ICC简档。一些颜色监视器和打印机包含嵌入的ICC配置文件信息,一些位图格式如TIFF。使用函数CGColorSpaceCreateICCBased。
- 校准的RGB是与设备无关的RGB颜色空间,其表示基于可由输出设备生成的最白光的相对于参考白点的颜色。使用函数CGColorSpaceCreateCalibratedRGB。
- 校准灰色是与设备无关的灰度颜色空间,其表示基于可由输出设备生成的最白光的相对于参考白点的颜色。使用函数CGColorSpaceCreateCalibratedGray
创建通用颜色空间
通用颜色空间会使颜色与系统匹配。 在大多数情况下,结果是可接受的。 虽然名称可能暗示另外,每个“通用”颜色空间 - 通用灰色,通用RGB和通用CMYK是特定的设备无关的颜色空间。
通用颜色空间易于使用; 您不需要提供任何参考点信息。 通过使用函数CGColorSpaceCreateWithName以及以下常量之一创建一个通用颜色空间:
- kCGColorSpaceGenericGray,它指定通用灰色,一个单色颜色空间,允许指定从绝对黑色(值0.0)到绝对白色(值1.0)的单个值。
- kCGColorSpaceGenericRGB,它指定通用RGB,一个三分量颜色空间(红色,绿色和蓝色),用于对彩色监视器上单个像素的组合方式进行建模。 RGB颜色空间的每个分量的值的范围从0.0(零强度)到1.0(全强度)。
- kCGColorSpaceGenericCMYK,它指定通用CMYK,这是一种四组分颜色空间(青色,品红色,黄色和黑色),用于模拟打印期间墨水建立的方式。 CMYK颜色空间的每个分量的值的范围从0.0(不吸收颜色)到1.0(完全吸收颜色)。
创建设备颜色空间
设备颜色空间主要由iOS应用程序使用,因为其他选项不可用。 在大多数情况下,Mac OS X应用程序应使用通用颜色空间,而不是创建设备颜色空间。 但是,一些Quartz例程需要具有设备颜色空间的图像。 例如,如果调用CGImageCreateWithMask并指定图像作为掩码,则必须使用设备灰色颜色空间定义图像。
您可以使用以下功能之一创建设备颜色空间:
- CGColorSpaceCreateDeviceGray用于设备相关的灰度颜色空间。
- CGColorSpaceCreateDeviceRGB用于设备相关的RGB颜色空间。
- CGColorSpaceCreateDeviceCMYK用于设备相关的CMYK颜色空间。
创建索引和模式颜色空间
Quartz提供了一套用于设置填充颜色,笔触颜色,颜色空间和alpha的功能。 每个颜色参数适用于图形状态,这意味着一旦设置,该设置将保持有效,直到设置为另一个值。
颜色必须具有关联的颜色空间。 否则,Quartz将不知道如何解释颜色值。 此外,您需要为绘图目的地提供适当的颜色空间。 将图4-4左侧的蓝色填充颜色(即CMYK填充颜色)与右侧显示的蓝色颜色(即RGB填充颜色)进行比较。 如果您查看此文档的屏幕版本,您会看到填充颜色之间的巨大差异。 颜色在理论上是相同的,但是只有当RGB颜色用于RGB设备并且CMYK颜色用于CMYK设备时才显示相同。
您可以使用函数CGContextSetFillColorSpace和CGContextSetStrokeColorSpace设置填充和描边颜色空间,或者您可以使用为设备颜色空间设置颜色的一个便利函数(如表4-2所示)。
您可以将填充和描边颜色指定为位于填充和描边颜色空间中的值。例如,在RGB颜色空间中的完全饱和的红色被指定为四个数字的数组:(1.0,0.0,0.0,1.0)。前三个数字指定全红色强度,没有绿色或蓝色强度。第四个数字是alpha值,用于指定颜色的不透明度。
如果在应用程序中重用颜色,设置填充和笔触颜色的最有效的方法是创建一个CGColor对象,然后将其作为参数传递给函数CGContextSetFillColorWithColor和CGContextSetStrokeColorWithColor。你可以保持CGColor对象周围,只要你需要它。您可以通过直接使用CGColor对象来提高应用程序的性能。
通过调用函数CGColorCreate创建一个CGColor对象,传递一个CGColorspace对象和一个指定颜色强度值的浮点值数组。数组中的最后一个组件指定了alpha值。
设置呈现意图
渲染意图指定Quartz如何将颜色从源颜色空间映射到图形上下文的目标颜色空间的色域内。 如果没有明确设置渲染意图,Quartz对除了位图(抽样)图像之外的所有绘图使用相对色度渲染意图。 Quartz使用感知的渲染意图。
要设置渲染意图,请调用函数CGContextSetRenderingIntent,传递图形上下文和以下常量之一:
- kCGRenderingIntentDefault。使用上下文的默认渲染意图。
- kCGRenderingIntentAbsoluteColorimetric。将输出设备的色域外的颜色映射到输出设备的色域内最接近的可能匹配。这可以产生削波效果,其中图形上下文的色域中的两个不同的颜色值被映射到输出设备的色域中的相同的颜色值。这是当图形中使用的颜色在源和目的地的色域内时的最佳选择,如标志的情况或使用专色时的情况。
- kCGRenderingIntentRelativeColorimetric。相对比色将所有颜色(包括色域内的那些颜色)偏移以考虑图形上下文的白点与输出设备的白点之间的差异。
- kCGRenderingIntentPerceptual。通过压缩图形上下文的色域以适应输出设备的色域内,保持颜色之间的视觉关系。感知意图是好的对照片和其他复杂,详细的图像。
- kCGRenderingIntentSaturation。当转换为输出设备的色域时,保留颜色的相对饱和度值。结果是具有明亮,饱和的颜色的图像。饱和度意图有助于再现低细节的图像,如演示图表和图表。