版本记录
版本号 | 时间 |
---|---|
V1.0 | 2018.09.04 |
前言
Quartz 2D
框架相信大家都知道,也都一直在使用。Quartz 2D
的API是纯C语言的,它是一个二维绘图引擎,同时支持iOS和Mac系统。Quartz 2D
的API来自于Core Graphics
框架,数据类型和函数基本都以CG作为前缀,接下来几篇我们就一起来看一下这个框架。感兴趣可以看上面几篇文章。
1. Quartz 2D编程指南 (一) —— 简介(一)
2. Quartz 2D编程指南 (二) —— Quartz 2D概览(二)
3. Quartz 2D编程指南 (三) —— 图形上下文(三)
4. Quartz 2D编程指南 (四) —— Paths路径(一)
5. Quartz 2D编程指南 (五) —— Paths路径(二)
Color and Color Spaces - 颜色和颜色空间
设备(显示器,打印机,扫描仪,照相机)不会以同样的方式处理颜色;每个设备都有自己产生的颜色范围。 在一台设备上生成的颜色可能无法在其他设备上生成。
要有效地处理颜色并理解使用颜色空间和颜色的Quartz 2D
函数,您应该熟悉Color Management Overview中讨论的术语。 该文档讨论了颜色感知,颜色值,设备无关和设备颜色空间,颜色匹配问题,渲染意图,颜色管理模块和ColorSync
。
在本章中,您将学习Quartz如何表示颜色和颜色空间,以及alpha组件是什么。 本章还讨论了如何:
- 创建颜色空间
- 创建和设置颜色
- 设置渲染意图
About Color and Color Spaces - 关于颜色和颜色空间
Quartz
中的颜色由一组值表示。 没有指示如何解释颜色信息的颜色空间,这些值是没有意义的。 例如,表4-1中的值均表示全强度时的蓝色。 但是,如果不知道颜色空间或每个颜色空间允许的值范围,您无法知道每组值所代表的颜色。
Table 4-1 Color values in different color spaces
如果提供错误的色彩空间,则会产生相当大的差异,如图4-1所示。 虽然绿色在BGR和RGB颜色空间中被解释相同,但红色和蓝色值被翻转。
颜色空间可以具有不同数量的组成部分。 表中的三个颜色空间有三个组件,而CMYK颜色空间有四个。 值范围相对于该颜色空间。 对于大多数颜色空间,Quartz中的颜色值范围为0.0到1.0,1.0表示完全强度。 例如,在Quartz中的RGB颜色空间中指定的全强度的蓝色具有值(0,0,1.0)
。 在Quartz中,color还有一个alpha值,用于指定颜色的透明度。 表4-1中的颜色值未显示alpha值。
The Alpha Value - 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
其中source
是新颜色的一个组件,destination
是背景颜色的一个组件。对于每个新绘制的形状或图像执行该公式。
对于对象透明度,将alpha值设置为1.0以指定您绘制的对象应完全不透明;将其设置为0.0以指定新绘制的对象是完全透明的。 0.0到1.0之间的alpha值指定部分透明的对象。您可以为所有接受颜色的例程提供alpha值作为最后一个颜色分量。您还可以使用CGContextSetAlpha
函数设置全局Alpha
值。请记住,如果同时设置两者,Quartz会将alpha颜色分量乘以全局alpha值。
要允许页面本身完全透明,只要图形上下文是窗口或位图图形上下文,您就可以使用CGContextClearRect
函数显式清除图形上下文的Alpha通道。例如,您可能希望在为图标创建透明蒙版时执行此操作,或者使窗口的背景透明。
Creating Color Spaces - 创建颜色空间
Quartz支持颜色管理系统用于与设备无关的颜色空间的标准颜色空间,并且还支持通用,索引和图案颜色空间。与设备无关的颜色空间(Device-independent color spaces)
以可在设备之间移植的方式表示颜色。它们用于将颜色数据从一个设备的原生颜色空间交换到另一个设备的原生颜色空间。与设备无关的颜色空间中的颜色在不同设备上显示时显示相同,达到设备功能允许的程度。因此,与设备无关的色彩空间是表示色彩的最佳选择。
具有精确颜色要求的应用程序应始终使用与设备无关的颜色空间。常见的设备无关颜色空间是通用颜色空间(generic color space)
。通用色彩空间让操作系统为您的应用程序提供最佳色彩空间。绘制到显示器看起来与将相同内容打印到打印机一样好。
重要提示:iOS不支持与设备无关或通用的颜色空间。 iOS应用程序必须使用设备颜色空间。
1. Creating Device-Independent Color Spaces - 创建与设备无关的颜色空间
要创建与设备无关的颜色空间,请为Quartz提供特定设备的参考白点,参考黑点和gamma
值。 Quartz使用此信息将源颜色空间中的颜色转换为输出设备的颜色空间。
Quartz支持与设备无关的颜色空间,以及创建它们的函数是:
-
L * a * b *
是Munsell
颜色表示系统(一种通过色调,值和饱和度或色度值指定颜色的系统)的非线性变换。该色彩空间将感知的色差与色彩空间中的定量距离相匹配。L *
分量表示亮度值,a *
分量表示从绿色到红色的值,b *
分量表示从蓝色到黄色的值。这个色彩空间旨在模仿人类大脑如何解码颜色。使用函数CGColorSpaceCreateLab
。 -
ICC
是ICC
颜色配置文件的颜色空间,由国际色彩联盟(International Color Consortium)
定义。 ICC配置文件定义设备支持的色域以及其他设备特性,以便此信息可用于将一个设备的色彩空间准确转换为另一个设备的色彩空间。该设备的制造商通常提供ICC配置文件。某些彩色显示器和打印机包含嵌入式ICC配置文件信息,一些位图格式(如TIFF
)也是如此。使用函数CGColorSpaceCreateICCBased
。 - 校准RGB
(Calibrated RGB )
是与设备无关的RGB颜色空间,表示相对于参考白点的颜色,该参考白点基于输出设备可以生成的最白光。使用函数CGColorSpaceCreateCalibratedRGB
。 - 校准灰度
(Calibrated gray)
是与设备无关的灰度色彩空间,表示相对于参考白点的颜色,该白点基于输出设备可以生成的最白光。使用函数CGColorSpaceCreateCalibratedGray
。
2. Creating Generic Color Spaces - 创建通用颜色空间
通用颜色空间(Generic color spaces)
使颜色与系统匹配。对于大多数情况,结果是可以接受的。虽然名称可能暗示其他情况,但每个“通用”颜色空间 - 通用灰色,通用RGB和通用CMYK-是特定于设备的颜色空间。
通用色彩空间易于使用;您不需要提供任何参考点信息。您可以使用函数CGColorSpaceCreateWithName
以及以下常量之一创建通用颜色空间:
-
kCGColorSpaceGenericGray
,指定通用灰色,单色色彩空间,允许指定从绝对黑色(值0.0)到绝对白色(值1.0)的单个值。 -
kCGColorSpaceGenericRGB
,指定通用RGB,三分量颜色空间(红色,绿色和蓝色),用于模拟在彩色监视器上组合单个像素的方式。 RGB颜色空间的每个分量的范围从0.0(零强度)到1.0(全强度)。 -
kCGColorSpaceGenericCMYK
,指定通用CMYK
,四组分色彩空间(青色,品红色,黄色和黑色),用于模拟打印过程中墨水积累的方式。 CMYK颜色空间的每个分量的值范围从0.0(不吸收颜色)到1.0(完全吸收颜色)。
3. Creating Device Color Spaces - 创建设备颜色空间
设备颜色空间主要由iOS应用程序使用,因为其他选项不可用。 在大多数情况下,Mac OS X
应用程序应使用通用颜色空间,而不是创建设备颜色空间。 但是,一些Quartz例程期望具有设备颜色空间的图像。 例如,如果调用CGImageCreateWithMask并将图像指定为蒙版,则必须使用设备灰色颜色空间定义图像。
您可以使用以下某个函数创建设备颜色空间:
-
CGColorSpaceCreateDeviceGray
用于依赖于设备的灰度色彩空间。 -
CGColorSpaceCreateDeviceRGB
用于依赖于设备的RGB颜色空间。 -
CGColorSpaceCreateDeviceCMYK
用于设备相关的CMYK颜色空间。
4. Creating Indexed and Pattern Color Spaces - 创建索引和图案颜色空间
索引颜色空间包含最多256个条目的颜色表,以及颜色表条目映射到的基色空间。 颜色表中的每个条目都指定基色空间中的一种颜色。 使用函数CGColorSpaceCreateIndexed
。
Patterns中讨论的图案颜色空间在使用图案绘制时使用。 使用函数CGColorSpaceCreatePattern
。
Setting and Creating Colors - 设置和创建颜色
Quartz
提供了一套用于设置填充颜色,描边颜色,颜色空间和alpha的功能。 这些颜色参数中的每一个应用于图形状态,这意味着一旦设置,该设置将保持有效直到设置为另一个值。
颜色必须具有关联的颜色空间。 否则,Quartz
将不知道如何解释颜色值。 此外,您需要为绘图目标提供适当的颜色空间。 比较图4-4左侧的蓝色填充颜色(CMYK填充颜色),右侧显示蓝色,这是RGB填充颜色。 如果您查看此文档的屏幕版本,您将看到填充颜色之间的巨大差异。 颜色在理论上是相同的,但只有当RGB颜色用于RGB设备并且CMYK颜色用于CMYK设备时才显示相同。
您可以使用CGContextSetFillColorSpace
和CGContextSetStrokeColorSpace
函数来设置填充和描边颜色空间,也可以使用为设备颜色空间设置颜色的便捷函数之一(在表4-2中列出)。
Table 4-2 Color-setting functions
您可以将填充和描边颜色指定为填充和描边颜色空间中的值。例如,RGB颜色空间中的完全饱和的红色被指定为四个数字的数组:(1.0,0.0,0.0,1.0)。前三个数字指定全红色强度,没有绿色或蓝色强度。第四个数字是alpha值,用于指定颜色的不透明度。
如果在应用程序中重用颜色,设置填充和描边颜色的最有效方法是创建一个CGColor
对象,然后将其作为参数传递给函数CGContextSetFillColorWithColor
和CGContextSetStrokeColorWithColor
。只要您需要,您可以保留CGColor
对象。您可以直接使用CGColor对象来提高应用程序的性能。
您可以通过调用函数CGColorCreate
来创建CGColor
对象,传递CGColorspace
对象和一个指定颜色强度值的浮点值数组。数组中的最后一个组件指定了alpha值。
Setting Rendering Intent - 设置渲染意图
渲染意图指定Quartz如何将颜色从源颜色空间映射到图形上下文的目标颜色空间的色域内的颜色。如果未明确设置渲染意图,Quartz会对除位图(采样)图像之外的所有绘图使用相对色度渲染意图。 对于除位图(采样)图像,Quartz使用感知渲染意图。
要设置渲染意图,请调用函数CGContextSetRenderingIntent
,传递图形上下文和以下常量之一:
-
kCGRenderingIntentDefault
。使用上下文的默认渲染意图。 -
kCGRenderingIntentAbsoluteColorimetric
。将输出设备色域之外的颜色映射到输出设备色域内最接近的可能匹配。这可以产生剪切效果,其中图形上下文的色域中的两个不同颜色值被映射到输出设备的色域中的相同颜色值。当图形中使用的颜色在源和目标的色域内时,这是最佳选择,这通常是logo或使用专色时的情况。 -
kCGRenderingIntentRelativeColorimetric
。相对色度移动所有颜色(包括色域内的那些颜色)以考虑图形上下文的白点与输出设备的白点之间的差异。 -
kCGRenderingIntentPerceptual
。通过压缩图形上下文的色域以适应输出设备的色域,保留颜色之间的视觉关系。感知意图适用于照片和其他复杂,详细的图像。 -
kCGRenderingIntentSaturation
。转换为输出设备的色域时,保留颜色的相对饱和度值。结果是具有明亮饱和色彩的图像。饱和度意图适用于再现低细节的图像,例如演示图表和图形。
后记
本篇主要讲述了颜色和颜色空间,感兴趣的给个赞或者关注~~~