UIColor,CGColor,CIColor三者的差別和接洽
比來看了看CoreGraphics的器械,看到關於CGColor的器械,因而就想著趁便看看UIColor,CIColor,弄清晰它們之間的差別和接洽。上面我們分離看看它們三個的概念:
1、UIColor
UIColor是UIKit中存儲色彩信息的一個主要的類,一個UIColor對象包括了色彩和通明度的值,它的色彩空間曾經針對IOS停止了優化。UIColor包括了一些類辦法用於創立一些最多見的色彩,如白色,黑色,白色,通明色等,這些色彩的顏色空間也不盡雷同(白色和黑色是kCGColorSpaceDeviceGray,白色的顏色空間是kCGColorSpaceDeviceRGB)。
另外UIColor還有兩個主要的屬性:一個是CGColor,一個是CIColor(5.0以後添加)。這兩個屬性便可以把UIColor,CGColor,CIColor三個對象接洽起來了,前面會具體引見這三者之間的轉換。
2、CGColor
CGColor重要用於CoreGaphics框架當中,CGColor實際上是個構造體,而我們平日在應用的CGColor的時刻應用的是它的援用類型CGColorRef。CGColor重要由CGColorSapce和Color Components兩個部門構成,異樣的色彩構成,假如色彩空間分歧的話,解析出來的成果能夠會有所分歧。這就像我們在處置圖片數據的時刻,假如把RGBA格局當做BGRA格局處置的成果可想而知。在Quartz 2D中CGColor經常使用來設置context的填充色彩,設置通明度等。
1、若何創立一個CGColor,最經常使用的函數是CGColorCreate,該函數有兩個參數:
1) colorspace,指定CGColor對應的色彩空間,Quartz就會retain該對象,是以挪用完以後你便可以平安的釋放該對象。
2) components,一個CGFloat的數組,該數組的元素個數是指定顏色空間包括的色彩重量數n,加上對應的alpha值。
該函數該前往一個新創立的CGColorRef,當我們不再應用該對象的時刻應用CGColorRelease函數釋放該對象。
2、獲得CGColor的數據
在我們創立的時刻傳入兩個主要的參數出來,當我們獲得到了CGColorRef今後固然便可以拿到對應的ColorSpace和Components。
1) 獲得ColorSpace
經由過程CGColorGetColorSpace函數我們可以獲得到以後CGColorRef對應的ColorSpace,該函數只接收一個參數就是你要獲得ColorSpace的CGColorRef。上面請看一個簡略的例子:
CGColorRef cgColor = [UIColor redColor].CGColor;
CGColorSpaceRef colorSpace = CGColorGetColorSpace(cgColor);
NSLog(@"color space: %@", colorSpace);
2) 獲得Color Components
要獲得到CGColorRef對應的色彩值,我們須要用到CGColorGetNumberOfComponents和CGColorGetComponents兩個函數。我們先來看看兩個函數的函數原型:
size_t CGColorGetNumberOfComponents (
CGColorRef color
);
const CGFloat * CGColorGetComponents (
CGColorRef color
);
第一個函數是取得CGColorRef的中包括的色彩構成部門的個數,第二個函數就是獲得現實的色彩構成部門的數組,上面看一個小例子:
NSUInteger num = CGColorGetNumberOfComponents(cgColor);
const CGFloat *colorComponents = CGColorGetComponents(cgColor);
for (int i = 0; i < num; ++i) {
NSLog(@"color components %d: %f", i, colorComponents[i]);
}
3、CIColor
CIColor重要是用於和Core Image框架中其他類,好比CIFilter,CIContext和CIImage。明天我們重要關懷的色彩值部門,CIColor中色彩值的規模是0.0-1.0之間,0.0代表該色彩重量為最小值,1.0代表改色彩重量為最年夜值。個中alpha值的規模也是0.0到1.0之間,0.0代表全通明,1.0代表完整不通明,同時CIColor的色彩重量平日都是沒有乘以alpha值。
我們可使用initWithCGColor:函數,經由過程CGColor創立一個CIColor。個中傳入的CGColorRef對象可使任何任何色彩空間,然則Core Image框架會在傳入filter kernel之前把一切的色彩空間轉換到core image任務色彩空間。core image任務色彩空間應用三個色彩重量加上一個alpha重量構成(其實就是kCGColorSpaceDeviceRGB),前面的例子中我們驗證這一點。
4、UIColor,CGColor,CIColor的差別和接洽
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);
全部進程中,我們經由過程運轉異樣可以發明,當我們用一個CMYK色彩空間的CGColor來初始化CIColor的時刻,CIColor的色彩空間仍然是CMYK,然則色彩值曾經轉換成RGB的色彩值。當應用該CIColor創立一個UIColor的時刻,我們再經由過程CIColor和CGColor屬性打印信息的時刻,我們會發明CIColor的顏色空間仍然是CMYK,然則CGColor打印所獲得的信息解釋它曾經被轉換成RGB空間了。
5、UIColor延長,若何斷定兩個色彩能否相等
後面提到一點,不論UIColor應用CIColor,CGColor照樣其他方法初始化的,其CGColor屬性都是可用的。CoreGraphics中供給一個辦法可以斷定兩個CGColor能否相等,是以我們可以經由過程斷定兩個UIColor能否相等,上面是看一個簡略的例子:
// judge two CGColor is equal
if (CGColorEqualToColor([UIColor whiteColor].CGColor, [UIColor colorWithRed:1 green:1 blue:1 alpha:1].CGColor)) {
NSLog(@"The two CGColor is equal!");
}
else {
NSLog(@"The two CGColor is not equal!");
}
if (CGColorEqualToColor([UIColor colorWithRed:1 green:1 blue:1 alpha:1].CGColor, [UIColor colorWithRed:1 green:1 blue:1 alpha:1].CGColor)) {
NSLog(@"The two CGColor is equal!");
}
else {
NSLog(@"The two CGColor is not equal!");
}
例子中第一部門是斷定兩個白色的UIColor能否相等,固然都是白色,然則色彩空間是紛歧樣的,經由過程運轉我們可以發明,打印出“The two CGColor is not equal!”。例子的第二部門簡略的創立了兩個RGB空間的UIColor,運轉法式可以看出,這兩種色彩是雷同的。
斷定兩個UIColor的色彩值能否相等
前兩天有個同伙問我若何斷定兩個色彩的值能否相等,我想只需斷定兩個色彩的RGBA值能否相等不久可以了嘛,因而開端查找贊助文檔找到了UIColor類,很輕易就找到了函數:
- (BOOL)getRed:(CGFloat *)red green:(CGFloat *)green blue:(CGFloat *)blue alpha:(CGFloat *)alpha;
如許便可以斷定兩個UIColor對象的色彩能否相等,代碼以下:
enum {
enEqual,
enNotEaual,
enCannotConvert,
};
typedef NSInteger KCompareResult;
+ (KCompareResult) isTheSameColor:(UIColor*)color
redValue:(CGFloat)rValue
greenValue:(CGFloat)gValue blueValue:(CGFloat)bValue
alphaValue:(CGFloat)aValue
{
if ([color respondsToSelector:@selector(getRed:green:blue:alpha:)]) {
CGFloat redValue, greenValue, blueValue, alphaValue;
if ([color getRed:&redValue green:&greenValue blue:&blueValue alpha:&alphaValue]) {
if (redValue == rValue && greenValue == gValue && blueValue == bValue && alphaValue == aValue) {
return enEqual;
}
else {
return enNotEaual;
}
}
else { // can not convert
return enCannotConvert;
}
}
}
【iOS的UIColor類與其相干類之間的差別及斷定相等的辦法】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!