CGContext 和 CIContext

這篇文章就對這兩個context 做一個詳細的介紹逛拱。

CGContext

屬于Core Graphics(使用Quartz 進行2D渲染偏塞,處理基于路徑的繪圖、抗鋸齒渲染寒屯、漸變罕偎、圖像洛心、顏色管理儿奶、pdf文檔等宝与。 說白了就是2D繪圖 渲染功能)框架.
我們平時用的其實都是他的引用類型 CGContextRef

   typedef struct CGContext *CGContextRef;

同時也發(fā)現(xiàn)喜滨,CGContext是一個結(jié)構(gòu)體捉捅,而并不是一個Object。CGContextRef是一個指向CGContext結(jié)構(gòu)體的指針虽风。

其實 Core Graphics 其中的類型棒口,都和這個類似。如:
CGColor  --->   CGColorRef
CGPath   --->   CGPathRef
CGImage  --->   CGImageRef
CGLayer  --->   CGLayerRef
CGShading--->   CGShadingRef
CGFont   --->   CGFontRef
CGPDFObject->   CGPDFObjectRef

CGContext 可以看做是一個2D 作圖的畫布辜膝。 而iOS 有多種畫布无牵,這些畫布都以堆棧的形式存放。(只有最上面的那個context才有效厂抖,有push pop的概念)

  1. 獲取CGContextRef
1. UIGraphicsGetCurrentContext () 
    在 -(void)drawRect:(CGRect)rect 里面獲取contex的方法茎毁。

2. UIGraphicsPushContext(ctx)
    UIGraphicsPopContext()
    也就是壓入棧 和 推出棧,
    在 -(void)drawLayer:(CALayer*)layer inContext:(CGContextRef)ctx
    里面調(diào)用即可吧當前的context 放到棧頂忱辅,方能生效七蜘。

    //該函數(shù)會自動創(chuàng)建一個context谭溉,并把它push到上下文棧頂
    //開始 scale 為0 則表示跟隨設(shè)備,opaque YES黑色畫布橡卤,NO透明畫布
3. UIGraphicsBeginImageContextWithOptions(size, opaque, scale)
    UIGraphicsBeginImageContext(size)//開始
    UIGraphicsGetCurrentContext()//獲取context
    UIGraphicsGetImageFromCurrentImageContext()  //獲取圖片
    UIGraphicsEndImageContext()  //結(jié)束
  1. 在Context上畫
1. image drawInRect
2. layer renderInContext
3. CGContextSet...  //color, width, line, render, blendMode,  should...
    CGContextAdd...  //Line, Path, Arc, Ellipse, 
    CGContextDraw/Fill ...  //rect, path, stroke, replace

4. CGContextDrawImage(ctx, rect, image)
5. CGContextDrawShading(ctx, shading)
6. CGContextDrawLinearGradient(ctx, gradient, startPoint, endPoint, options); //漸變
7. CGContextDrawPDFPage(ctx, PDFPage);
8. CGContextShowGlyphsAtPositions(ctx, glyphs, *Lpositions, count);//雕文
9.CGContextShowText(ctx,  *string, length)//已作廢夜只,用CoreText 實現(xiàn)
  1. 坐標互轉(zhuǎn): Converting(基本上看,名字都能明白是什么意思)
CGContextGetUserSpaceToDeviceSpaceTransform //Transform

CGContextConvertPointToDeviceSpace
CGContextConvertPointToUserSpace

CGContextConvertSizeToDeviceSpace 
CGContextConvertSizeToUserSpace 

CGContextConvertRectToDeviceSpace 
CGContextConvertRectToUserSpace
  1. CTM (current graphics state's transformation matrix 當前圖形狀態(tài)的轉(zhuǎn)換矩陣)
//在上下文中得到的CTM是:CTMnew = transform * CTMcontext蒜魄。
CGContextConcatCTM(ctx, transform) //矩陣 相乘(順序固定的)

 //在上下文中得到CTM
CGContextGetCTM(ctx)

CGContextRotateCTM     //旋轉(zhuǎn)
CGContextTranslateCTM  //位移
CGContextScaleCTM      //縮放
  1. 保存扔亥,重設(shè) context的狀態(tài)
CGContextSaveGState(ctx)   保存當前的context的狀態(tài)到堆棧上
CGContextRestoreGState(ctx)  把堆棧上第一個contex的保存狀態(tài),重新設(shè)置回去

CGContextGetTypeID  上下文的標識ID
CGContextFlush      強制吧所有的draw 都更新到contex(一般是系統(tǒng)周期性的自動調(diào)用 更新畫布)
CGContextSynchronize更新畫布谈为,系統(tǒng)在下次刷新時旅挤,draw所有操作。(相當于 做了一個需要更新的標記)

CIContext

CIContext 屬于Core Image框架(文檔中提到 主要的功能就是 用內(nèi)置或自定義的過濾器處理圖片和視頻 以及 在視頻圖片中檢測面部和眼睛子類的特征和跟蹤面部伞鲫。和Core Graphics的主要區(qū)別 就是更注重于視頻圖片的加工處理)的粘茄,是一個OC對象。一般和 CIImage秕脓,CIColor柒瓣,CIFilter等交互。

  1. 創(chuàng)建CIContext:
1. + contextWithOptions   / + context
2. + contextWithCGContext:options:     //CPU 渲染(用到了CGContextRef)
3. + contextWithCGLContext:pixelFormat:colorSpace:options: //GPU渲染(OpenGL 包含GL的)
  1. 在畫布上畫:
//獲取 渲染的圖片(CIImage -> CGImage)
 creatCGImage:fromRect ...
render:to ...    //Bitmap吠架, CVPixelBuffer芙贫, IOSurface, MTLTexture(一個支持GPU加速3D繪圖的API)

//在context上畫 圖片
- drawImage:inRect:fromRect:  

二者的關(guān)聯(lián), 使用:

    CIImage * outputImage = [filter outputImage]; //從CIFilter 獲取CIImage
    CGRect qrRect = [colorImage extent];

    //設(shè)置CIContext傍药,并從CIImage -> CGImage -> UIImage
    CIContext *context = [CIContext contextWithOptions:nil];
    CGImageRef cgImage = [context createCGImage: outputImage fromRect:qrRect];
    UIImage *resultIamge = [UIImage imageWithCGImage:cgImage];
    //(如果 直接用[UIImage imageWithCIImage:outputImage]; 會得到一個不是位圖的圖片)
    
    
    UIImage* deviceImage = [UIImage imageNamed:@"device"];
    
    //開始Image的CGContext
    UIGraphicsBeginImageContext(CGSizeMake(1000, 1000));
    
    //獲取 image的 CGContextRef
    CGContextRef cgContext = UIGraphicsGetCurrentContext();

    //CGContextRef 和 CIContext 關(guān)聯(lián)(二者表示同一畫布)
    context = [CIContext contextWithCGContext:cgContext options:nil];
    
    CIImage* deviceCIImage = [CIImage imageWithCGImage:deviceImage.CGImage];
    CIImage* resultCIImage = [CIImage imageWithCGImage:resultIamge.CGImage];
    
    //CIContext 吧圖片畫在context上
    [context drawImage:deviceCIImage inRect:CGRectMake(0, 0, 1000, 1000) fromRect:[deviceCIImage extent]];
    [context drawImage:resultCIImage inRect:CGRectMake(200, 200, 600, 600) fromRect:qrRect];
    
    //從CGContextRef 上獲取圖片
    resultIamge = UIGraphicsGetImageFromCurrentImageContext();

    //結(jié)束Image的CGContext
    UIGraphicsEndImageContext();

從上面磺平,可以發(fā)現(xiàn)。這兩個context 都是畫布的意思拐辽,相似的地方非常多拣挪,而且可以互相關(guān)聯(lián)。只是所屬的庫不同俱诸,在用法上有些區(qū)別菠劝。

還有一個,就是CIImage 只有經(jīng)過context 轉(zhuǎn)化為CGImage后睁搭,才能變成位圖圖片赶诊。(非位圖圖片,不能保存到相冊介袜,不能轉(zhuǎn)換為NSData (jpeg png))

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末甫何,一起剝皮案震驚了整個濱河市出吹,隨后出現(xiàn)的幾起案子遇伞,更是在濱河造成了極大的恐慌,老刑警劉巖捶牢,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鸠珠,死亡現(xiàn)場離奇詭異巍耗,居然都是意外死亡,警方通過查閱死者的電腦和手機渐排,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門炬太,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人驯耻,你說我怎么就攤上這事亲族。” “怎么了可缚?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵霎迫,是天一觀的道長。 經(jīng)常有香客問我帘靡,道長知给,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任描姚,我火速辦了婚禮涩赢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘轩勘。我一直安慰自己筒扒,他們只是感情好,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布绊寻。 她就那樣靜靜地躺著霎肯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪榛斯。 梳的紋絲不亂的頭發(fā)上观游,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機與錄音驮俗,去河邊找鬼懂缕。 笑死,一個胖子當著我的面吹牛王凑,可吹牛的內(nèi)容都是我干的搪柑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼索烹,長吁一口氣:“原來是場噩夢啊……” “哼工碾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起百姓,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤渊额,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體旬迹,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡火惊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了奔垦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屹耐。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖椿猎,靈堂內(nèi)的尸體忽然破棺而出惶岭,到底是詐尸還是另有隱情,我是刑警寧澤犯眠,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布俗他,位于F島的核電站,受9級特大地震影響阔逼,放射性物質(zhì)發(fā)生泄漏兆衅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一嗜浮、第九天 我趴在偏房一處隱蔽的房頂上張望羡亩。 院中可真熱鬧,春花似錦危融、人聲如沸畏铆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辞居。三九已至,卻和暖如春蛋勺,著一層夾襖步出監(jiān)牢的瞬間瓦灶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工抱完, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贼陶,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓巧娱,卻偏偏與公主長得像碉怔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子禁添,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容

  • --繪圖與濾鏡全面解析 概述 在iOS中可以很容易的開發(fā)出絢麗的界面效果撮胧,一方面得益于成功系統(tǒng)的設(shè)計,另一方面得益...
    韓七夏閱讀 2,727評論 2 10
  • 原文地址:http://www.cocoachina.com/industry/20140115/7703.htm...
    默默_David閱讀 6,108評論 0 1
  • 一:canvas簡介 1.1什么是canvas老翘? ①:canvas是HTML5提供的一種新標簽 ②:HTML5 ...
    GreenHand1閱讀 4,683評論 2 32
  • 上午跟明星兄去他公司陪他加班芹啥,他要出圖锻离,最后去校對一遍。因為昨天已經(jīng)熱了叁征,我想在屋里呆著也很熱纳账,不如一起去他那逛薇。早...
    攜子之閱讀 181評論 0 0
  • 這個月基本上吃過來的捺疼。過年在家吃,平常跟好朋友出去吃永罚。吃吃喝喝玩玩樂樂啤呼,好像也沒什么大事。 我們幾個每個假期都會聚...
    蠢兔嘰閱讀 246評論 0 0