顏色的實質是表示顏色的二進制數據,若是沒有肯定的規則,則這些二進制數據徹底沒有意義。所謂色彩空間,便是表示這些顏色數據信息是如何解釋的。一樣的一張圖片,在不一樣的色彩空間下,其渲染的模樣將有很大的不一樣。在CoreGraphics框架中,與色彩相關的功能主要有CGColor與CGColorSpace構成。chrome
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用來描述色彩空間,其中方法解析以下:框架
//建立一個基於設備的黑白色彩空間 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);
相同的圖像,使用不一樣的色彩空間進行渲染,獲得的結果可能大不同,例如以下代碼修改圖片的色彩空間:ide
- (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]; }
效果以下:spa
原圖以下:code
模擬器運行以下:component
專一技術,熱愛生活,交流技術,也作朋友。索引
——琿少 QQ羣:203317592圖片