UIColor,CGColor,CIColor的區別和聯系
layer.shadowColor = [UIColor redColor].CGColor;
這個是今天用到的。順便總結一下。
1、UIColor的兩個屬性CGColor,CIColor
UIColor的CGColor總是有效的,不管它是通過CGColor,CIColor,還是其他方法創建的,CGColor屬性都總是有效的;但是CIColor屬性就不總是有效的,只有當UIColor是通過CIColor創建的時候,他才是有效的,否則訪問該屬性將會拋出異常,下面照舊來一個小例子:
// test init uicolor with CGColor UIColor *color = [UIColor colorWithCGColor:[UIColor whiteColor].CGColor]; // CGColor property is always valid NSLog(@"CGColor from UIColor %@", color.CGColor); // don't use CIColor property // This property throws an exception if the color object was not initialized with a Core Image color. NSLog(@"CIColor from UIColor %@", color.CIColor); // crush
2、UIColor使用CGColor初始化
當UIColor使用CGColor初始化的時候,所有CGColorRef包含的信息,都會被原封不動的保留,其中就包括Color space,而且通過下面的小例子我們還可以看到如果使用CGColor初始化UIColor的時候,UIColor其實是直接保留了一份這個CGColorRef對象。例子如下:
// test kCGColorSpaceDeviceCMYK CGColorSpaceRef cmykSpace = CGColorSpaceCreateDeviceCMYK(); CGFloat cmykValue[] = {1, 1, 0, 0, 1}; // blue CGColorRef colorCMYK = CGColorCreate(cmykSpace, cmykValue); CGColorSpaceRelease(cmykSpace); NSLog(@"colorCMYK: %@", colorCMYK); // color with CGColor, uicolor will just retain it UIColor *color = [UIColor colorWithCGColor:colorCMYK]; NSLog(@"CGColor from UIColor: %@", color.CGColor);
3、UIColor使用CIColor初始化
下面我們討論一下當使用CIColor來初始化一個UIColor的時候,再去訪問UIColor的CGColor屬性的時候,我們會發現CGColor的color Space和設置CIColor的color space的是不完全一樣的,在這個過程中CIColor會為我們做一個轉換。下面我們分別看看使用kCGColorSpaceDeviceGray,kCGColorSpaceDeviceRGB,kCGColorSpaceDeviceCMYK三種顏色空間來初始化一個CIColor的時候,再去使用該CIColor去初始化一個UIColor,然后在去訪問其CIColor屬,CGColor屬性,查看顏色空間並打印顏色信息。
1) 使用kCGColorSpaceDeviceGray初始化CIColor
首先看代碼:
// test kCGColorSpaceDeviceGray NSLog(@"CGColor white color:%@", [UIColor whiteColor].CGColor); CIColor *ciColor = [CIColor colorWithCGColor:[UIColor whiteColor].CGColor]; NSLog(@"cicolor: %@", ciColor); NSLog(@"cicolor colorspace: %@", ciColor.colorSpace); color = [UIColor colorWithCIColor:ciColor]; NSLog(@"color %@", color); // Core Image converts all color spaces to the Core Image working color // space before it passes the color space to the filter kernel. // kCGColorSpaceDeviceGray ---> kCGColorSpaceDeviceRGB NSLog(@"cicolor from UIColor: %@", color.CIColor); NSLog(@"cicolor's colorspace: %@", color.CIColor.colorSpace); NSLog(@"color's CGColor: %@", color.CGColor);
通過運行程序,我們看出來,如果使用一個kCGColorSpaceDeviceGray的顏色空間的CGColor來初始化CIColor的時候,我們可以看到CIColor的色彩空間一直是kCGColorSpaceDeviceGray,通過訪問UIColor的CIColor屬性,我們可以看到其顏色空間仍然是kCGColorSpaceDeviceGray,但是當訪問UIColor的CGColor屬性的時候,通過打印可以發現其色彩空間已經轉變成了kCGColorSpaceDeviceRGB空間了,而顏色值也正確的從原來的顏色空間轉換到了新的顏色空間。
2) 使用kCGColorSpaceDeviceRGB初始化CIColor
同樣的我們看代碼:
//test kCGColorSpaceDeviceRGB NSLog(@"CGColor red color:%@", [UIColor redColor].CGColor); CIColor *ciColor = [CIColor colorWithCGColor:[UIColor redColor].CGColor]; NSLog(@"cicolor: %@", ciColor); NSLog(@"cicolor colorspace: %@", ciColor.colorSpace); UIColor *color = [UIColor colorWithCIColor:ciColor]; NSLog(@"color %@", color); NSLog(@"cicolor from UIColor: %@", color.CIColor); NSLog(@"cicolor's colorspace: %@", color.CIColor.colorSpace); NSLog(@"color's CGColor: %@", color.CGColor);
整個過程中CIColor,以及通過UIColor的CGColor和CIColor屬性訪問到的值,打印出來我們可以發現它們都是kCGColorSpaceDeviceRGB空間的。
4、使用kCGColorSpaceDeviceCMYK初始化CIColor
下面繼續看一段代碼:
// test kCGColorSpaceDeviceCMYK CGColorSpaceRef cmykSpace = CGColorSpaceCreateDeviceCMYK(); NSLog(@"Components number: %zu", CGColorSpaceGetNumberOfComponents(cmykSpace)); CGFloat cmykValue[] = {1, 1, 0, 0, 1}; // blue CGColorRef colorCMYK = CGColorCreate(cmykSpace, cmykValue); CGColorSpaceRelease(cmykSpace); NSLog(@"colorCMYK: %@", colorCMYK); ciColor = [CIColor colorWithCGColor:colorCMYK]; NSLog(@"cicolor: %@", ciColor); // in fact,the color value of CIColor has converted to RGB Colorspace NSLog(@"cicolor colorspace: %@", ciColor.colorSpace); color = [UIColor colorWithCIColor:ciColor]; NSLog(@"UIColor with CIColor: %@", color); NSLog(@"cicolor from UIColor: %@", color.CIColor); NSLog(@"cicolor's colorspace: %@", color.CIColor.colorSpace); // when UIColor init with CIColor, UIColor's CGColor will convert other colorspace to kCGColorSpaceDeviceRGB NSLog(@"cgcolor from UIColor: %@", color.CGColor);