专栏首页一“技”之长iOS开发CoreGraphics核心图形框架之三——颜色与色彩空间

iOS开发CoreGraphics核心图形框架之三——颜色与色彩空间

iOS开发CoreGraphics核心图形框架之三——颜色与色彩空间

一、引言

    颜色的实质是表示颜色的二进制数据,如果没有确定的规则,则这些二进制数据完全没有意义。所谓色彩空间,即是表示这些颜色数据信息是如何解释的。同样的一张图片,在不同的色彩空间下,其渲染的模样将有很大的不同。在CoreGraphics框架中,与色彩相关的功能主要有CGColor与CGColorSpace构成。

二、关于CGColor相关方法的解析

    CGColorRef是CoreGraphics框架中用于描述颜色的引用类型,其中常用方法解析如下:

//根据色彩空间创建一个CGColorRef实例
/*
需要注意,这个方法中的第2个参数需要传递一个float数据,其需要和第1个参数的色彩空间意义对应
例如在RGBA色彩空间中,float数组中需要传递4个值,分别表示红绿蓝和透明度
*/
CGColorRef __nullable CGColorCreate(CGColorSpaceRef cg_nullable space, const CGFloat * cg_nullable components);
//创建黑白色彩空间下的颜色
/*
参数 
gray为灰度
alpha 为透明度
*/
CGColorRef  CGColorCreateGenericGray(CGFloat gray, CGFloat alpha);
//创建RGB色彩空间下的颜色
CGColorRef  CGColorCreateGenericRGB(CGFloat red, CGFloat green, CGFloat blue, CGFloat alpha);
//创建CMYB印刷模式色彩空间下的颜色
CGColorCreateGenericCMYK(CGFloat cyan, CGFloat magenta, CGFloat yellow, CGFloat black, CGFloat alpha);
//获取颜色常量
/*
colorName定义如下:
 //标准白色
 CFStringRef  kCGColorWhite;
 //标准黑色
 CFStringRef  kCGColorBlack;
 //标准透明色
 CFStringRef  kCGColorClear;
*/
CGColorRef __nullable CGColorGetConstantColor(CFStringRef cg_nullable colorName);
//通过模式与色彩空间创建颜色
CGColorRef __nullable CGColorCreateWithPattern(CGColorSpaceRef cg_nullable space, CGPatternRef cg_nullable pattern, const CGFloat * cg_nullable components);
//复制一个CGColorRef
CGColorRef __nullable CGColorCreateCopy(CGColorRef cg_nullable color);
//复制颜色 并追加透明度
CGColorRef __nullable CGColorCreateCopyWithAlpha(CGColorRef cg_nullable color, CGFloat alpha);
//将原色彩空间与目标色彩空间相匹配 创建颜色实例
/*
CGColorRenderingInter设置颜色渲染模式
typedef CF_ENUM (int32_t, CGColorRenderingIntent) {
    kCGRenderingIntentDefault,   //默认的渲染模式
    kCGRenderingIntentAbsoluteColorimetric, //绝对比色模式
    kCGRenderingIntentRelativeColorimetric, //相对比色模式
    kCGRenderingIntentPerceptual,   //压缩色域模式
    kCGRenderingIntentSaturation   //转换色域模式
};
*/
CGColorRef __nullable CGColorCreateCopyByMatchingToColorSpace(cg_nullable CGColorSpaceRef, CGColorRenderingIntent intent, CGColorRef cg_nullable color, __nullable CFDictionaryRef options);
//内存引用+1
CGColorRef cg_nullable CGColorRetain(CGColorRef cg_nullable color);
//内存引用-1
void CGColorRelease(CGColorRef cg_nullable color);
//比较两个颜色引用是否相同
bool CGColorEqualToColor(CGColorRef cg_nullable color1, CGColorRef cg_nullable color2);
//获取颜色内容的色彩描述值个数 包括alpha通道
size_t CGColorGetNumberOfComponents(CGColorRef cg_nullable color);
//获取颜色色彩描述值数组
CGFloat * __nullable CGColorGetComponents(CGColorRef cg_nullable color);
//获取颜色的透明度
CGFloat CGColorGetAlpha(CGColorRef cg_nullable color);
//获取颜色的色彩空间
CGColorSpaceRef __nullable CGColorGetColorSpace(CGColorRef cg_nullable color);
//获取与此颜色相关的模型
CGPatternRef __nullable CGColorGetPattern(CGColorRef cg_nullable color);
//获取CGColorRef类在CoreGraphics框架中的id
CFTypeID CGColorGetTypeID(void);

三、关于CGColorSpace相关方法解析

    CGColorSpace用来描述色彩空间,其中方法解析如下:

//创建一个基于设备的黑白色彩空间
CGColorSpaceRef cg_nullable CGColorSpaceCreateDeviceGray(void);
//创建一个基于设备的RGB色彩空间
CGColorSpaceRef cg_nullable CGColorSpaceCreateDeviceRGB(void);
//创建一个基于设备的CMYK色彩空间
CGColorSpaceRef cg_nullable CGColorSpaceCreateDeviceCMYK(void);
//创建一个经过校准的黑白色彩空间
CGColorSpaceRef __nullable CGColorSpaceCreateCalibratedGray(const CGFloat whitePoint[3], const CGFloat blackPoint[3], CGFloat gamma);
//创建一个经过校准的RGB色彩空间
CGColorSpaceRef __nullable CGColorSpaceCreateCalibratedRGB(const CGFloat whitePoint[3], const CGFloat blackPoint[3], const CGFloat gamma[3], const CGFloat matrix[9]);
//创建一个经过校准的LAB色彩空间
CGColorSpaceRef __nullable CGColorSpaceCreateLab(const CGFloat whitePoint[3], const CGFloat blackPoint[3], const CGFloat range[4]);
//使用ICC文件创建ICC-based色彩空间
CGColorSpaceRef __nullable CGColorSpaceCreateWithICCProfile(CFDataRef cg_nullable data);
CGColorSpaceRef __nullable CGColorSpaceCreateICCBased(size_t nComponents, const CGFloat * __nullable range, CGDataProviderRef cg_nullable profile, CGColorSpaceRef __nullable alternate);
//使用索引创建色彩空间
CGColorSpaceRef __nullable CGColorSpaceCreateIndexed(CGColorSpaceRef cg_nullable baseSpace, size_t lastIndex, const unsigned char * cg_nullable colorTable);
//通过名称创建色彩空间
/*
标准的黑白色彩空间
CFStringRef kCGColorSpaceGenericGray;
标准的RGB色彩空间
const CFStringRef kCGColorSpaceGenericRGB;
标准的CMYK色彩空间
CFStringRef kCGColorSpaceGenericCMYK;
displatP3色彩空间
CFStringRef kCGColorSpaceDisplayP3;
LinearRGB色彩空间
CFStringRef kCGColorSpaceGenericRGBLinear;
Adobe RGB 1998 版本的色彩空间
CFStringRef kCGColorSpaceAdobeRGB1998;
黑白色彩空间 设置伽马值为2.2
CFStringRef kCGColorSpaceGenericGrayGamma2_2;
XYZ色彩空间
CFStringRef kCGColorSpaceGenericXYZ;
ACEScg色彩空间
kCGColorSpaceACESCGLinear;
ITU-R Recommendation BT.709 色彩空间
kCGColorSpaceITUR_709;
ITU-R Recommendation BT.2020色彩空间
kCGColorSpaceITUR_2020;
RGB色彩空间
kCGColorSpaceROMMRGB;
DCI P3 色彩空间
kCGColorSpaceDCIP3;
扩展的sRGB色彩空间
kCGColorSpaceExtendedSRGB;
线性sRGB色彩空间
kCGColorSpaceLinearSRGB;
扩展的线性sRGB扩展空间
CFStringRef kCGColorSpaceExtendedLinearSRGB;
扩展的黑白色彩空间
CFStringRef kCGColorSpaceExtendedGray;
扩展的线性黑白色彩空间
CFStringRef kCGColorSpaceLinearGray;
扩展的Generic Gray 2.2色彩空间
CFStringRef kCGColorSpaceExtendedLinearGray;
*/
CGColorSpaceRef __nullable CGColorSpaceCreateWithName(CFStringRef cg_nullable name);
//内存引用计数+1
CGColorSpaceRef cg_nullable CGColorSpaceRetain(CGColorSpaceRef cg_nullable space);
//内存引用计数-1
void CGColorSpaceRelease(CGColorSpaceRef cg_nullable space);
//进行色彩空间的复制
CFStringRef __nullable CGColorSpaceCopyName(CGColorSpaceRef cg_nullable space);
//获取CGColorRef类在CoreGraphics框架中的id
CFTypeID CGColorSpaceGetTypeID(void);
//获取色彩空间颜色值参数个数
CGColorSpaceGetNumberOfComponents(CGColorSpaceRef cg_nullable space);
//获取色彩空间模式
/*
typedef CF_ENUM (int32_t,  CGColorSpaceModel) {
    kCGColorSpaceModelUnknown = -1,  未知模式
    kCGColorSpaceModelMonochrome,    单色色彩空间模式
    kCGColorSpaceModelRGB,           RGB色彩空间模式
    kCGColorSpaceModelCMYK,          CMYK色彩空间模式
    kCGColorSpaceModelLab,           LAB色彩空间模式
    kCGColorSpaceModelDeviceN,       设备色彩空间模式
    kCGColorSpaceModelIndexed,       引用色彩空间模式
    kCGColorSpaceModelPattern        模型色彩空间模式
};

*/
CGColorSpaceModel CGColorSpaceGetModel(CGColorSpaceRef cg_nullable space);

相同的图像,使用不同的色彩空间进行渲染,得到的结果可能大不一样,例如如下代码修改图片的色彩空间:

- (void)viewDidLoad {
    [super viewDidLoad];
    CGImageRef image = CGImageCreateCopyWithColorSpace([UIImage imageNamed:@"image"].CGImage, CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB));
    CGImageRef image2 = CGImageCreateCopyWithColorSpace([UIImage imageNamed:@"image"].CGImage, CGColorSpaceCreateWithName(kCGColorSpaceROMMRGB));
    UIImageView * imageView = [[UIImageView alloc]initWithImage:[UIImage imageWithCGImage:image]];
    UIImageView * imageView2 = [[UIImageView alloc]initWithImage:[UIImage imageWithCGImage:image2]];
    imageView.frame = CGRectMake(100, 100, 200, 200);
    imageView2.frame = CGRectMake(100, 300, 200, 200);
    [self.view addSubview:imageView];
    [self.view addSubview:imageView2];
}

效果如下:

原图如下:

模拟器运行如下:

专注技术,热爱生活,交流技术,也做朋友。 ——珲少 QQ群:203317592

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SDWebImage源码分析 原

         SDWebImage是iOS开发中非常流行的一个网络图片加载库,如果你观察其源码,会发现其中的文件非常多,虽然文件数很多,但是作者的代码结构和条理却是...

    珲少
  • iOS中ImageIO框架详解与应用分析 原

        ImageIO框架提供了读取与写入图片数据的基本方法,使用它可以直接获取到图片文件的内容数据,ImageIO框架中包含6个头文件,其中完成主要功能的是前...

    珲少
  • iOS开发CoreGraphics核心图形框架之六——梯度渐变

       关于颜色梯度渐变视图的创建,CoreGraphics框架中提供了两个类型CGShadingRef与CGGradientRef。CoreGraphics框架...

    珲少
  • 网易云音乐的消息队列改造之路

    网易云音乐自2013年上线后,业务保持了高速增长。云音乐除了提供好听的音乐外,还留下了我们在乐和人上的美好回忆。本文整理自网易云音乐消息队列负责人林德智在近期 ...

    用户1516716
  • 网易云音乐的消息队列改造之路

    网易云音乐自2013年上线后,业务保持了高速增长。云音乐除了提供好听的音乐外,还留下了我们在乐和人上的美好回忆。本文整理自网易云音乐消息队列负责人林德智在近期 ...

    哲洛不闹
  • 深度学习在医学影像上的应用(四)——检测

    上一篇给大家介绍了深度学习在医学影像上分割的应用,这一篇我将分享深度学习在医学影像上检测应用。

    用户7498388
  • 什么是忆阻器?

    前两天听AI芯片的报告,有位教授提到了基于忆阻器的AI芯片,今早刚好DeepTech深科技里报道了密歇根大学在这方面的进展(基于忆阻器的AI芯片)。借此机会,小...

    光学小豆芽
  • Nginx中配置开启Nginx Status来查看服务器运行状态

    这篇文章主要介绍了Nginx中配置开启Nginx Status来查看服务器运行状态的方法,Nginx Status为Nginx服务器内置的状态页,需要的朋友可以...

    习惯说一说
  • Golang中image/jpeg包和image/png包用法

    jpeg包实现了jpeg图片的编码和解码 func Decode(r io.Reader) (image.Image, error) //Decode读取一...

    李海彬
  • Cell Reports | 靶向单细胞多组学方法,可在低深度下同时检测蛋白表达和低丰度转录组

    Fred Hutchinson 肿瘤研究中心在4月7日的CELL REPORTS 杂志在线发表最新文章。

    生信交流平台

扫码关注云+社区

领取腾讯云代金券