iOS開發CoreGraphics核心圖形框架之三——顏色與色彩空間

iOS開發CoreGraphics核心圖形框架之三——顏色與色彩空間

1、引言

    顏色的實質是表示顏色的二進制數據,若是沒有肯定的規則,則這些二進制數據徹底沒有意義。所謂色彩空間,便是表示這些顏色數據信息是如何解釋的。一樣的一張圖片,在不一樣的色彩空間下,其渲染的模樣將有很大的不一樣。在CoreGraphics框架中,與色彩相關的功能主要有CGColor與CGColorSpace構成。chrome

2、關於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);

3、關於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);

相同的圖像,使用不一樣的色彩空間進行渲染,獲得的結果可能大不同,例如以下代碼修改圖片的色彩空間: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圖片

相關文章
相關標籤/搜索