CoreGraphics Color and Color Spaces(颜色和颜色空间)

Color and Color Spaces(颜色和颜色空间)

不同的设备处理颜色的方式是不同的, 每个设备都有他所支持的颜色范围, 在一个设备上产生的颜色可能在另一台设备上无法提供.

在本章中,我们将学习Quartz处理颜色和颜色空间,以及什么是alpha组件。本章同时也讨论如下问题:
  • Create color spaces (创建颜色空间)

  • Create and set colors (创建和设置颜色)

  • Set rendering intent (设置再现意图)

About Color and Color Spaces(关于颜色和颜色空间)

在Quartz中的一个颜色是用一组数值所描绘的. 但是如果没有颜色空间对这些数值进行颜色解析, 那么这些数值将没有任何意义, 下面的表格是蓝色在不同的颜色空间下的不同参数, 如果不知道是什么颜色空间和颜色空间所能接受的值, 那么我们将不会知道一组值所代表的颜色.

如果我们提供了错误的颜色空间, 我们得到的结果会有些不同的. 如下图所示, 尽管绿色的区域颜色相同, 还是红色和蓝色还是有一些差别的.



颜色空间可以有不同数量的组件, 如上表格中所示, 有三个颜色空间是三个组件, 而CMYK有四个组件, 对于大部分的颜色空间, 颜色的值是从0.0~1.0这个区间的, 当值等于1.0的时候代表满的颜色值, 例如蓝色,在RGB颜色空间中的值是(0, 0, 1.0), 颜色也是有透明度的, 在表格4-1中没有透明度的值.

The Alpha Value(透明度)

透明度的值制图状态参数, Quartz用来确定怎么来把一个新的对象和一个存在的对象混合. 在全强度下, 新的被着色的对象是不透明的, 在0强度下, 新的被着色的对象是不可见的, 下图中4-2示例了五个大的矩形, 分别用透明度,1.0, 0.75, 0.5, 0.1, 和0.0表示, 随着大的矩形逐渐变成透明, 它下面的不透明的红色的矩形逐渐的显示出来.


我们可以在页面上创建两个对象, 并且在页面的渲染前通过设置一个全局的透明值在他的绘图区域, 图4-3比较了一个0.5的全局透明度和默认1.0透明度的区别.


在正常情况下, Quartz执行透明是通过下面的公式来把原颜色参数和目标原色混合的.

destination = (alpha * source) + (1 - alpha) * destination

其中源颜色是新绘制的颜色, 目标颜色是背景颜色, 这个公式可以用于新的图形和图像的绘制.

对于对象的透明性, 你可以通过设置透明度1.0来指定你绘画的对象是完全不透明的, 设置透明度0.0来指定你绘画的对象是完全透明的, 设置透明度在0.0 ~ 1.0 之间来指点一个部分透明的对象, 你可以在颜色参数中, 用最后一个值来指定颜色的透明度, 你也可以用CGContextSetAlpha函数来设定一个全局的透明度. 请牢记, 如果你同时设置了两个, Quartz将把全局的透明值和参数的透明值相乘使用.

为了允许页面本身完全透明, 你可以用CGContextClearRect函数来明确的清除制图区域的透明度, 例如当你想为一个图标创建一个透明的遮罩, 或者使得一个窗口透明.

Creating Color Spaces(创建颜色空间)

Quartz提供了颜色管理系统使用标准颜色空间用于  device-independent 颜色空间, 也同样提供了标准(generic)颜色空间, 索引(indexed)颜色空间, 和模式(pattern)颜色空间. D evice-independent 颜色空间通过在便携的设备之间来描绘颜色. 它们用于两种设备之间的本地颜色数据的互相转换. 在 device-independent 颜色空间, 颜色在不同设备上显示的时候是一样的, 拓展了设备的能力. 因为这个原因, 利用  device-independent 颜色空间来描绘颜色是最好的选择. 

如果应用程序有精确的颜色渲染需求, 应该用device-independent颜色空间, 标准(generic)颜色空间是常用的颜色空间, generic颜色空间让操作系统为你的应用提供了最好颜色空间. 它可以让显示器上绘画的和打印机打印出来的效果是一样的.

注: iOS不能够支持device-independent 和 generic 颜色空间. iOS应用必须用设备(device)颜色空间代替.

Creating Device-Independent Color Spaces


为了创建一个 device-independent 颜色空间, 我们需要给Quartz提供一个白色的参考点, 一个黑色的参考点, 和gamma值, Quartz利用这些信息将源颜色空间转化成输出设备的颜色空间.

Quartz 支持 device-independent 颜色空间, 创建此空间的函数如下:
  • L*a*b*是Munsell颜色标记系统(通过色度, 值, 和饱和度---色度-值来指定颜色)的非线性转换. 这个颜色空间匹配颜色数量上的区别. L* 描绘亮度值, a* 描绘绿色和红色之间的值, b*描绘蓝色和黄色之间的值. 这个颜色空间的设计师在模仿人脑怎样解码颜色. 用CGColorSpaceCreateLab这个函数.
  • ICC是国际颜色组织(International Color Consortium)定义的颜色空间. ICC定义颜色支持的颜色域, 与其他设备颜色域相同, 所以这些信息可以被用于把一台设备的颜色空间正确无误的转换成另一台设备的颜色空间. 设备的生产商特定的提供一个ICC描述文件. 一些颜色监控器和打印机包含内置的ICC描述文件信息. 用于处理一些诸如TIFF位图格式. 用CGColorSpaceCreateICCBased 函数.
  • 标准化的RGB 是一个 device-independent RGB 颜色空间, 它描绘颜色通过一个基于能被输出设备生成的白色参考点,  用CGColorSpaceCreateCalibratedRGB 函数.
  • 标准化灰度是 device-independent 灰度 颜色空间, 他描绘衍射通过一个基于能被输出设备生成的白色参考点, 用CGColorStaceCreateCalibratedGray 函数

Creating Generic Color Spaces

 标准(Generic)颜色空间许可颜色匹配到系统. 大多数情况下, 这个结果是可接受的. 尽管名字也许意义不同,  每一个"generic"颜色空间--generic gray, generic RGB, 和generic CMYK 都是特殊的 device-independent 颜色空间.

Generic颜色空间用起来都很简单; 我们不需要提供任何的参考点信息, 我们用 CGColorSpaceCreateWithName函数来创建一个generic颜色空间:
  • kCGColorSpaceGenericGray, 指定generic gray, 一个允许指定从绝对黑色 (值: 0.0) 到绝对白色 (值: 1.0) 的单色颜色空间.
  • kCGColorSpaceGenericRGB, 指定generic RGB, 该颜色空间由三个部件组成(red, green, and blue), 模拟在颜色显示器上单独的一个像素点的组成, RGB颜色空间中每个部件的值是从0.0 (0强度) 到1.0 (满强度).
  • kCGColorSpaceGenericCMYK, 指定generic CMYK, 该颜色空间是有四个部件组成(cyan, magenta, yellow, 和 black), 模拟墨水在打印过程中的形成方式, CMYK颜色空间中灭个部件的值是从0.0到1.0

Creating Device Color Spaces(iOS只能用这个颜色空间)


设备颜色空间主要用于iOS应用程序, 因为其他的颜色空间不可以在iOS中应用. 在大多数情况下, 一个Mac OS X 应用程序应该用一个generic颜色空间代替设备颜色空间. 然而, 有些Quartz程序希望图像使用设备空间. 例如, 如果我们调用 CGImageCreateWithMask 函数, 指定一张图片作为遮罩, 这个图片必须在灰度设备(device-gray)颜色空间中被定义.

我们可以用下面的任意一个函数来创建一个设备颜色空间:
  • CGColorSpaceCreateDeviceGray  一个device-dependent 灰度颜色空间
  • CGColorSpaceCreateDeviceRGB  一个device-dependent RGB颜色空间
  • CGColorSpaceCreateDeviceCMYK 一个device-dependent CMYK颜色空间

Creating Indexed and Pattern Color Spaces


索引颜色空间包含了一个256个词目的颜色表, 并且每个基本的颜色空间都被表中的每个词目所对应. 表中的每个颜色词目多指定一个颜色空间. 用函数 CGColorSpaceCreateIndexed创建.

模式颜色空间在绘制模式时使用, 用函数CGColorSpaceCreatePattern创建

Setting and Creating Colors(设置并创建颜色)

Quartz提供了一组函数, 用来设置填充颜色(fill color), 线框颜色(stroke color), 颜色空间(color spaces)和alpha值. 每个颜色参数应用于制图状态, 也就是意味着, 一旦设置了这些参数, 这个设置将会一直起作用直到设置了一个其他的值为止.

一个颜色必须有一个与之关联的颜色空间, 否则, Quartz 不知道怎么来破译颜色值, 更进一步的说, 为了绘画完成. 你必须提供一个合适的颜色空间. 如图4-4, 比较一下蓝色填充在CMYK颜色空间(左侧),和蓝色填充在RGB颜色空间(右侧)的不同. 在理论上, 这些颜色应该是相同的, 但是只有当RGB颜色被用于RGB设备, CMYK颜色被用于CMYK设备时, 才会出现同一样的颜色.


你可以用CGContextSetFillColorSpace函数和CGContextSetStrokeColorSpace函数来设置fill和stroke颜色空间, 或者你可以使用表4-2中的函数方便的设置设备的颜色空间.


你在填充和线框颜色空间时指定色值. 例如, 在RGB颜色空间中一个饱和的红色通过一个数量为4的数组(1.0, 0.0, 0.0, 1.0)来指定.
前三个数字指定的是, 全强度的红, 和无强度的绿色, 蓝色, 第四个数字就是透明度, 用来指定颜色的不透明.

如果我们想在我们的应用程序中重用颜色, 最有效的方法就是设置填充颜色和线框颜色来创建一个CGColor对象, 然后把参数传递给CGContextSetFillColorWithColorCGContextSetStrokeColorWithColor 函数, 只要我们需要, 我们可以一直持有这个CGColor对象, 我们可以直接的通过利用CGColor对象来提高我们应用程序的性能.

我们通过调用CGColorCreate函数来创建一个CGColor对象, 传递一个CGColorspace对象和一个指定颜色强度的浮点型数组值参数, 数组中的最后一个参数是透明度.

Setting Rendering Intent(设置渲染目的)

渲染目的指定了Quartz是怎么从源颜色空间到制图区域的目标颜色空间映射的. 如果我们不能明确的设置渲染目的, Quartz对于出来位图以外的绘画利用有关联的色度渲染目的. 对于这种, Quartz 利用感知渲染目的.

用来设置渲染目的, 调用CGContextSetRenderingIntent函数, 传递一个制图区域和下面的约束:

  • kCGRenderingIntentDefault. 对于这个区域用默认的渲染目的.
  • kCGRenderingIntentAbsoluteColorimetric. 绝对色度渲染目的. 把输出设备颜色域外映射为和内部最可能相近的颜色. 这可以提供裁剪效果, 当两个不同颜色在制图区域的一组颜色映射到输出设备的一组相同的颜色, 当用于制图的源和目标颜色都在一组颜色内, 这是最好的选择, 用于logos 或者专色.
  • kCGRenderingIntentRelativeColorimetric.  相对色度渲染目的. 对于有关系色度变化的所有颜色, 补偿制图区域的白色点和输出设备的白色点.
  • kCGRenderingIntentPerceptual. 感知渲染目的.通过压缩一组制图区域来适应一组内部颜色和输出设备的一组颜色,保持视觉的关系, 感知渲染目的对于相片和其他复杂, 细度高的图片非常实用.
  • kCGRenderingIntentSaturation. 饱和度渲染目的. 当转换到一组输出设备时保持关联颜色的饱和, 结果是一个高亮的, 饱和的颜色图片, 饱和度渲染对于制造的低细度的图片非常好, 例如报告图表或图片.




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值