Quartz 2D编程指南 (六) —— 颜色和颜色空间(一)

版本记录

版本号 时间
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颜色空间中被解释相同,但红色和蓝色值被翻转。

Figure 4-1 Applying a BGR and an RGB color profile to the same image

颜色空间可以具有不同数量的组成部分。 表中的三个颜色空间有三个组件,而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绘制的五个大矩形。 当大矩形变得透明时,它会在下面露出一个较小的不透明红色矩形。

Figure 4-2 A comparison of large rectangles painted using various alpha values

通过在绘制之前在图形上下文中全局设置alpha值,可以使页面上的对象和页面本身都透明。 图4-3将全局alpha设置0.5与默认值1.0进行比较。

Figure 4-3 A comparison of global alpha values

在普通混合模式(这是图形状态的默认模式)中,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
  • ICCICC颜色配置文件的颜色空间,由国际色彩联盟(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设备时才显示相同。

Figure 4-4 A CMYK fill color and an RGB fill color

您可以使用CGContextSetFillColorSpaceCGContextSetStrokeColorSpace函数来设置填充和描边颜色空间,也可以使用为设备颜色空间设置颜色的便捷函数之一(在表4-2中列出)。

Table 4-2 Color-setting functions

您可以将填充和描边颜色指定为填充和描边颜色空间中的值。例如,RGB颜色空间中的完全饱和的红色被指定为四个数字的数组:(1.0,0.0,0.0,1.0)。前三个数字指定全红色强度,没有绿色或蓝色强度。第四个数字是alpha值,用于指定颜色的不透明度。

如果在应用程序中重用颜色,设置填充和描边颜色的最有效方法是创建一个CGColor对象,然后将其作为参数传递给函数CGContextSetFillColorWithColorCGContextSetStrokeColorWithColor。只要您需要,您可以保留CGColor对象。您可以直接使用CGColor对象来提高应用程序的性能。

您可以通过调用函数CGColorCreate来创建CGColor对象,传递CGColorspace对象和一个指定颜色强度值的浮点值数组。数组中的最后一个组件指定了alpha值。


Setting Rendering Intent - 设置渲染意图

渲染意图指定Quartz如何将颜色从源颜色空间映射到图形上下文的目标颜色空间的色域内的颜色。如果未明确设置渲染意图,Quartz会对除位图(采样)图像之外的所有绘图使用相对色度渲染意图。 对于除位图(采样)图像,Quartz使用感知渲染意图。

要设置渲染意图,请调用函数CGContextSetRenderingIntent,传递图形上下文和以下常量之一:

  • kCGRenderingIntentDefault。使用上下文的默认渲染意图。
  • kCGRenderingIntentAbsoluteColorimetric。将输出设备色域之外的颜色映射到输出设备色域内最接近的可能匹配。这可以产生剪切效果,其中图形上下文的色域中的两个不同颜色值被映射到输出设备的色域中的相同颜色值。当图形中使用的颜色在源和目标的色域内时,这是最佳选择,这通常是logo或使用专色时的情况。
  • kCGRenderingIntentRelativeColorimetric。相对色度移动所有颜色(包括色域内的那些颜色)以考虑图形上下文的白点与输出设备的白点之间的差异。
  • kCGRenderingIntentPerceptual。通过压缩图形上下文的色域以适应输出设备的色域,保留颜色之间的视觉关系。感知意图适用于照片和其他复杂,详细的图像。
  • kCGRenderingIntentSaturation。转换为输出设备的色域时,保留颜色的相对饱和度值。结果是具有明亮饱和色彩的图像。饱和度意图适用于再现低细节的图像,例如演示图表和图形。

后记

本篇主要讲述了颜色和颜色空间,感兴趣的给个赞或者关注~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容