CGColorSpace

表示指定的颜色值

CGColorSpaceRef
//一个配置文件,指定如何解释显示的颜色值。

概述

颜色空间是多维的,每个维度表示特定的颜色分量。例如,RGB颜色空间的颜色有R,G,B三个三个维度.颜色空间的的每个维度强度由浮点值表示,其范围和含义取决于所讨论的颜色空间

我们通过正确指定的颜色空间可以确保图像具有一致的外观

Core Graphics支持多种颜色空间:

  1. 与设备无关的颜色空间: 校准的色彩空间。 确保在不同设备上现实的颜色相同,
  2. 与设备相关的颜色空间: 依赖于设备的颜色空间与特定设备的颜色表示系统相关联。
  3. 特殊的颜色空间: 使用索引和对应的基色空间 索引颜色空间包含了最多256个颜色表以及每个颜色表的条目都制定基色空间的一种颜色

创建与设备无关的颜色空间

为了创建与设备无关的颜色空间,我们需要提供白色参考点,黑色参考点以及特殊设备的gamma值

  1. 创建标准的灰度色彩空间

    CGColorSpaceCreateCalibratedGray

    创建与设备无关的灰度颜色空间,表示相对于参考白点的颜色

    CGColorSpaceRef CGColorSpaceCreateCalibratedGray(const CGFloat *whitePoint, const CGFloat *blackPoint, CGFloat gamma);
    whitePoint :   3个数字的数组,制定了在CIE 1931 XYZ-space颜色系统中漫反射白点的3刺激值 (对色彩学不熟悉)
    blackPoint : 3个数字的数组,制定了在CIE 1931 XYZ-space颜色系统中漫反射黑点的3刺激值
    gamma : 适合于成像设备的伽马值。
    返回一个新的灰色色彩空间,需要主动调用`CGColorSpaceRelease`来释放
  2. 创建校准的RGB颜色空间
    CGColorSpaceCreateCalibratedRGB

    创建与设备无关的RGB颜色空间,表示相对于参考白点的颜色。 此白点基于输出设备可以生成的最白光。 与设备无关的颜色空间中的颜色在不同设备上显示时应该相同,只要设备的功能允许。
    对于需要详细伽玛的色彩空间,例如sRGB或ITU-R BT.709中使用的分段传递函数,可以使用函数CGColorSpaceCreateICCBased,因为它可以准确地表示这些伽玛曲线。

    CGColorSpaceRef CGColorSpaceCreateCalibratedRGB(const CGFloat *whitePoint, const CGFloat *blackPoint, const CGFloat *gamma, const CGFloat *matrix);
    whitePoint:
    blackPoint
    gamma: 一个由3个数字组成的数组,用于指定颜色空间的红色,绿色和蓝色分量的伽玛值。
    matrix: 9个数字的数组,指定相对于最终XYZ表示的颜色空间的伽马修改的RGB值的线性解释。
    返回一个新的RGB色彩空间,需要主动调用`CGColorSpaceRelease`来释放
  3. 创建根绝ICC颜色配置文件的规范
    CGColorSpaceCreateICCBased

    根据ICC颜色配置文件创建基于ICC的色彩空间

    CGColorSpaceRef CGColorSpaceCreateICCBased(size_t nComponents, const CGFloat *range, CGDataProviderRef profile, CGColorSpaceRef alternate);
    
  4. 创建根据 CIE Lab标准与人类感知相关颜色

    CGColorSpaceCreateLab
    CIE L * a * b*空间是Munsell颜色表示系统(一种通过色调,值和饱和度或“色度”值指定颜色的系统)的非线性变换,旨在将感知色差与定量距离相匹配 在色彩空间。 L *分量表示亮度值,a *分量表示从绿色到红色的值,b *分量表示从蓝色到黄色的值。 这大致对应于人脑被认为解码颜色的方式。 与设备无关的颜色空间中的颜色在不同设备上显示时应该相同,只要设备的功能允许。

    CGColorSpaceRef CGColorSpaceCreateLab(const CGFloat *whitePoint, const CGFloat *blackPoint, const CGFloat *range);
    whitePoint:
    blackPoint:
    range:一个由4个数字组成的数组,用于指定颜色空间的a *和b *组件的有效值范围。 a *组件表示从绿色到红色的值,b *组件表示从蓝色到黄色的值。

创建通用或者与设备相关的颜色空间

当在不同的输出设备上显示时,设备颜色空间中的颜色经常显得不同。 因此,在保持颜色很重要时,不建议使用设备颜色空间

  1. CMYK颜色空间

    CGColorSpaceRef CGColorSpaceCreateDeviceCMYK(void);
    使用完后需要主动调用CGColorSpaceRelease进行释放
    
  2. 灰度颜色空间

    CGColorSpaceRef CGColorSpaceCreateDeviceGray(void);
    
  3. RGB颜色空间

    CGColorSpaceRef CGColorSpaceCreateDeviceRGB(void);
    
  4. 特定平台的颜色空间

    CGColorSpaceRef CGColorSpaceCreateWithPlatformColorSpace(const void *ref);
    platformColorSpace:指向特定于平台的颜色空间的通用指针。 在macOS中,传递CMProfileRef-a ColorSync配置文件。 Quartz仅在函数调用期间使用此指针(和基础信息)
    

创建特殊颜色空间

  1. 创建索引颜色空间,由颜色查找表指定的颜色组成。

    索引颜色空间包含最多255个条目的颜色表,以及颜色表条目映射到的基色空间。 颜色表中的每个条目都指定基色空间中的一种颜色。 索引颜色空间中的值被视为颜色空间的颜色表的索引。 表中的数据采用网格格式。 (例如,对于RGB颜色空间,值为R,G,B,R,G,B等。)

    CGColorSpaceRef CGColorSpaceCreateIndexed(CGColorSpaceRef baseSpace, size_t lastIndex, const unsigned char *colorTable);
    baseSpace:颜色索引表基于的 基色颜色空间
    lastIndex: 索引表的最大下标值 必须<=255
    colorTable: m *(lastIndex + 1)个字节的数组,其中m是基色空间中的颜色分量数。 每个字节是0到255范围内的无符号整数,它被缩放到基色空间中相应颜色分量的范围。
  2. 创建图案颜色空间

    CGColorSpaceRef CGColorSpaceCreatePattern(CGColorSpaceRef baseSpace);
    baseSpace:对于蒙版图案,底层颜色空间指定要通过蒙版绘制的颜色。 对于彩色图案,您应该传递NULL。
    
  3. 创建指定类型的Quartz颜色空间

    我们可以使用此函数创建通用的颜色空间等,查看Color Space Name

    CGColorSpaceRef CGColorSpaceCreateWithName(CFStringRef name);
    name:颜色空间名称
    

颜色空间的引用和释放

//减少颜色空间的引用计数
void CGColorSpaceRelease(CGColorSpaceRef space);

//增加颜色空间的引用计数
CGColorSpaceRef CGColorSpaceRetain(CGColorSpaceRef space);