一、使用UIImage和CGImage處理圖位
可用通過Quartz的圖片對象或原始圖片數(shù)據(jù)來創(chuàng)建UIImage。UIImage還提供了一些方法,允許將自身繪制到繪圖Context中。
1、顯示動畫
UIImage支持的各種圖片格式:
標簽圖像文件格式(TIFF) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? .tiff、.tif
JPEG(Joint Photographic Experts Group)格式 ? ?.jpg、.jpeg
GIF(Graphic Interchange Format)格式 ? ? ? ? ? ? ? .gif
PNG(Portable Network Graphic)格式 ? ? ? ? ? ? ? ? .png
Windows位圖格式(DIB)格式 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?.bmp、.BMPf
Windows圖標格式 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?.ico
Windows光標格式 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?.cur
Window系統(tǒng)位圖 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?.xbm
當系統(tǒng)內(nèi)存緊張時,UIImage會將圖片數(shù)據(jù)從UIImage對象中清理出去,以節(jié)省系統(tǒng)內(nèi)存,這里的清理行為只是清理UIImage內(nèi)部存儲的圖片數(shù)據(jù),并不清理UIImage對象本身。當程序使用一個圖片數(shù)據(jù)被清理過的UIImage對象時,該UIImage將會自動從原始的圖片文件中加載圖片數(shù)據(jù)。
盡量避免使用UIImage加載過大(如大雨1024 * 1024)的圖片
用UIimage來顯示靜止的圖片,通常用一下方法:
+imageNamed:加載指定文件名對應的圖片,該方法有緩存機制,用該方法加載的文件不存在,它才會去加載圖片文件并緩存它;如果已經(jīng)緩存過指定圖片,該方法直接使用已緩存的圖片。
當程序需要頻繁加載、卸載圖片文件時,不要使用該方法來加載圖片
+imageWithContentsOfFile:該方法用于加載指定文件名對應圖片。
+imageWithData:該方法用于根據(jù)NSData中封裝的圖片數(shù)據(jù)來創(chuàng)建圖片。
+imageWithData:scale:該方法用于根據(jù)NSData中封裝的圖片數(shù)據(jù)來創(chuàng)建圖片,并按指定縮放因子對圖片進行縮放。
+imageWithCGImage:該方法用于根據(jù)指定的CGImageRef對象來創(chuàng)建UIImage。
+imageWithCGImage:scale:orientation:該方法用于根據(jù)指定的CGImageRef對象來創(chuàng)建UIImage,按照指定scale來對圖片進行縮放,按照orientation參數(shù)對圖片進行旋轉、鏡像等。
+animatedImageNamed:duration:根據(jù)指定圖片名來加載一系列圖片
+animatedImageWithImages:duration:傳入一個每個對象都是UIImage對象的數(shù)組,作為多張動畫圖片。
2、CGImage與CGImageRef
UIImage雖然可以加載、顯示各種格式的位圖,甚至可以同時加載圖片、并依次播放多張圖片形成動畫,但是它不能對圖片進行縮放、旋轉,不能截取指定區(qū)域等,這些功能可借助Quartz2D的CGImageRef來實現(xiàn)。
UIImage與CGImageRef可以相互轉換。CGImageRef只是一個指針類型。
二、Quartz2D繪圖
使用Quartz2D繪圖的關鍵步驟有兩步:獲取CGContextRef;調(diào)用CGContextRef方法進行繪圖。
1、Quartz2D提供的繪圖函數(shù):
CGContextClearRect(CGContectRef c, CGRect rect) //擦除指定區(qū)域繪制圖形
CGContextDrawPath(CGContextRef? _Nullable c, CGPathDrawingMode mode) //使用指定模式繪制當前CGContextRef所包含的路徑。第二個參數(shù)支持KCGPathFill、kCGPathEOFill、kCGPathStroke、kCGPathFillStroke、kCGPathEOFillStroke等枚舉值
CGContextEOFillPath(CGContextRef? _Nullable c) //使用奇偶規(guī)則來填充該路徑的區(qū)域,奇偶規(guī)則是指:如果某個點被路徑包圍了奇數(shù)次,name系統(tǒng)繪制該點;如果是偶數(shù)次則不繪制
CGContextFillPath(CGContextRef? _Nullable c)//填充CGContextRef所包含的路徑包圍的區(qū)域
CGContextFillRect(CGContextRef? _Nullable c, CGRect rect)//填充rect所代表的矩形
CGContextFillRects(CGContextRef? _Nullable c, const CGRect * _Nullable rects, size_t count)//填充多個矩形
CGContextFillEllipseInRect(CGContextRef? _Nullable c, CGRect rect)//填充rect矩形的內(nèi)切橢圓區(qū)域
CGContextStrokePath(CGContextRef? _Nullable c)//使用當前CGContextRef設置的線寬繪制路徑
CGContextStrokeRect(CGContextRef? _Nullable c, CGRect rect)//使用當前CGContextRef設置的繪制矩形框
CGContextStrokeRectWithWidth(CGContextRef? _Nullable c, CGRect rect, CGFloat width)//使用指定線寬繪制矩形
CGContextReplacePathWithStrokedPath(CGContextRef? _Nullable c)//使用繪制當前路徑時覆蓋的區(qū)域作為當前CGContextRef中的新路徑。
CGContextStrokeEllipseInRect(CGContextRef? _Nullable c, CGRect rect)//使用當前CGContextRef設置的線寬繪制rect矩形的內(nèi)切圓
CGContextStrokeLineSegments(CGContextRef? _Nullable c, const CGPoint * _Nullable points, size_t count)//使用當前CGContextRef設置的線寬繪制多條線段。
2、設置繪圖屬性的相關函數(shù)
CGContextSaveGState(CGContextRef? _Nullable c)//保存CGContextRef當前的繪圖狀態(tài),方便以后恢復該狀態(tài)
CGContextRestoreGState(CGContextRef? _Nullable c)//把CGContextRef的狀態(tài)恢復到最近一次保存時的狀態(tài)
CGContextGetInterpolationQuality(CGContextRef? _Nullable c)//獲取當前CGContextRef在放大圖片的插值質(zhì)量
CGContextSetInterpolationQuality(CGContextRef? _Nullable c, CGInterpolationQuality quality)//設置當前CGContextRef在放大圖片的插值質(zhì)量
CGContextSetLineCap(CGContextRef? _Nullable c, CGLineCap cap)//設置線段端點的繪制形狀。
CGContextSetLineDash(CGContextRef? _Nullable c, CGFloat phase, const CGFloat * _Nullable lengths, size_t count)//繪制邊框時所用的點線模式
CGContextSetLineJoin(CGContextRef? _Nullable c, CGLineJoin join)//設置線條連接點的風格
CGContextSetLineWidth(CGContextRef? _Nullable c, CGFloat width)//設置繪制直線、邊框時的線寬
CGContextSetMiterLimit(CGContextRef? _Nullable c, CGFloat limit)//把連接點風格設置為meter風格時,該函數(shù)用于控制銳角箭頭的長度
CGContextSetPatternPhase(CGContextRef? _Nullable c, CGSize phase)//設置該CGContextRef采用位圖填充的相位
CGContextSetFillPattern(CGContextRef? _Nullable c, CGPatternRef? _Nullable pattern, const CGFloat * _Nullable components)//設置該CGContextRef使用位圖填充
CGContextSetShouldAntialias(CGContextRef? _Nullable c, bool shouldAntialias)//設置該CGContextRef是否應該抗鋸齒
CGContextSetStrokePattern(CGContextRef? _Nullable c, CGPatternRef? _Nullable pattern, const CGFloat * _Nullable components)//設置該CGContextRef使用位圖繪制線條、邊框
CGContextSetBlendMode(CGContextRef? _Nullable c, CGBlendMode mode)//設置CGContextRef的疊加模式。
CGContextSetAllowsAntialiasing(CGContextRef? _Nullable c, bool allowsAntialiasing)//設置該CGContextRef是否允許抗鋸齒
CGContextSetAllowsFontSmoothing(CGContextRef? _Nullable c, bool allowsFontSmoothing)//設置該CGContextRef是否允許光滑字體
CGContextSetShouldSmoothFonts(CGContextRef? _Nullable c, bool shouldSmoothFonts)//設置該CGContextRef是否應該光滑字體
CGContextSetAlpha(CGContextRef? _Nullable c, CGFloat alpha)//設置全局透明度
CGContextSetCMYKFillColor(CGContextRef? _Nullable c, CGFloat cyan, CGFloat magenta, CGFloat yellow, CGFloat black, CGFloat alpha)//使用CMYK顏色模式來設置該CGContextRef的填充顏色
CGContextSetCMYKStrokeColor(CGContextRef? _Nullable c, CGFloat cyan, CGFloat magenta, CGFloat yellow, CGFloat black, CGFloat alpha)//使用CMYK顏色模式來設置該CGContextRef的線條顏色
CGContextSetFillColorWithColor(CGContextRef? _Nullable c, CGColorRef? _Nullable color)//使用指定顏色來實現(xiàn)該CGContextRef的填充顏色
CGContextSetShadowWithColor(CGContextRef? _Nullable c, CGSize offset, CGFloat blur, CGColorRef? _Nullable color)//使用指定顏色來實現(xiàn)該CGContextRef的線條顏色
CGContextSetGrayFillColor(CGContextRef? _Nullable c, CGFloat gray, CGFloat alpha)//使用灰色來實現(xiàn)該CGContextRef的填充顏色
CGContextSetGrayStrokeColor(CGContextRef? _Nullable c, CGFloat gray, CGFloat alpha)//使用灰色來實現(xiàn)該CGContextRef的線條顏色
CGContextSetRGBFillColor(CGContextRef? _Nullable c, CGFloat red, CGFloat green, CGFloat blue, CGFloat alpha)//使用RGB顏色來實現(xiàn)該CGContextRef的填充顏色
CGContextSetRGBStrokeColor(CGContextRef? _Nullable c, CGFloat red, CGFloat green, CGFloat blue, CGFloat alpha)//使用RGB顏色來實現(xiàn)該CGContextRef的線條顏色
CGContextSetShadow(<#CGContextRef? _Nullable c#>, <#CGSize offset#>, <#CGFloat blur#>)////設置陰影在x、y軸上的偏移,以及模糊度
CGContextSetShadowWithColor(<#CGContextRef? _Nullable c#>, <#CGSize offset#>, <#CGFloat blur#>, <#CGColorRef? _Nullable color#>)//設置陰影在x、y軸上的偏移,以及模糊度和陰影的顏色
3、點線模式繪制
CGContextSetLineDash(CGContextRef? _Nullable c, CGFloat phase, const CGFloat * _Nullable lengths, size_t count)//點線模式繪制
4、繪制文本
CGContextGetTextMatrix(CGContextRef? _Nullable c)獲取當前對文本執(zhí)行變換的變換矩陣
CGContextGetTextPosition(CGContextRef? _Nullable c) 獲取當前文本繪制位置
CGContextSetCharacterSpacing(CGContextRef? _Nullable c, CGFloat spacing)設置繪制文本的字符間距
CGContextSetFont(CGContextRef? _Nullable c, CGFontRef? _Nullable font)設置繪制文本字體
CGContextSetFontSize(CGContextRef? _Nullable c, CGFloat size)設置繪制文本字體大小
CGContextSetTextDrawingMode(CGContextRef? _Nullable c, CGTextDrawingMode mode)設置繪制文本的繪制模式
CGContextSetTextMatrix(CGContextRef? _Nullable c, CGAffineTransform t)設置對將要繪制的文本執(zhí)行指定的變換
CGContextSetTextPosition(CGContextRef? _Nullable c, CGFloat x, CGFloat y)設置繪制文本的繪制位置
5、設置陰影
CGContextSetShadow(<#CGContextRef? _Nullable c#>, <#CGSize offset#>, <#CGFloat blur#>)//設置陰影在X、Y軸上的偏移,并設置陰影模糊程度
CGContextSetShadowWithColor(<#CGContextRef? _Nullable c#>, <#CGSize offset#>, <#CGFloat blur#>, <#CGColorRef? _Nullable color#>)//設置陰影在X、Y軸上的偏移,并設置陰影模糊程度,設置陰影顏色
6、路徑使用
CGContextBeginPath(CGContextRef? _Nullable c)開始定義路徑
CGContextClosePath(CGContextRef? _Nullable c)關閉當前定義路徑
CGContextAddArc(CGContextRef? _Nullable c, CGFloat x, CGFloat y, CGFloat radius, CGFloat startAngle, CGFloat endAngle, int clockwise)向當前路徑添加一段圓弧
CGContextAddArcToPoint(CGContextRef? _Nullable c, CGFloat x1, CGFloat y1, CGFloat x2, CGFloat y2, CGFloat radius)向當前路徑添加一段圓弧
CGContextAddCurveToPoint(CGContextRef? _Nullable c, CGFloat cp1x, CGFloat cp1y, CGFloat cp2x, CGFloat cp2y, CGFloat x, CGFloat y)向當前路徑添加一段貝濟埃曲線
CGContextAddLines(CGContextRef? _Nullable c, const CGPoint * _Nullable points, size_t count)向當前路徑添加多條線段
CGContextAddLineToPoint(CGContextRef? _Nullable c, CGFloat x, CGFloat y)向當前路徑結束點連接到(x,y)點
CGContextAddQuadCurveToPoint(CGContextRef? _Nullable c, CGFloat cpx, CGFloat cpy, CGFloat x, CGFloat y)向當前路徑添加一條二次曲線
CGContextAddRect(CGContextRef? _Nullable c, CGRect rect)向當前路徑添加一個矩形
CGContextAddRects(CGContextRef? _Nullable c, const CGRect * _Nullable rects, size_t count)向當前路徑添加多個矩形
CGContextMoveToPoint(CGContextRef? _Nullable c, CGFloat x, CGFloat y)向當前路徑結束點移動到(x,y)點
CGContextAddEllipseInRect(CGContextRef? _Nullable c, CGRect rect)向當前路徑添加一個橢圓
CGContextCopyPath(CGContextRef? _Nullable c)復制當前路徑
CGContextAddPath(CGContextRef? _Nullable c, CGPathRef? _Nullable path)向當前路徑添加已有的路徑
CGContextIsPathEmpty(CGContextRef? _Nullable c)判斷CGContextRef包含的路徑是否為空
CGContextGetPathCurrentPoint(CGContextRef? _Nullable c)返回CGContextRef包涵路徑的當前點
CGContextGetPathBoundingBox(CGContextRef? _Nullable c)返回CGContextRef完整包圍的所有路徑的最小矩形
CGContextPathContainsPoint(CGContextRef? _Nullable c, CGPoint point, CGPathDrawingMode mode)CGContextRef包含的路徑按指定繪制模式進行繪制時,是否需要繪制point點
7、繪制曲線
CGContextAddCurveToPoint()添加貝濟埃曲線
CGContextAddQuadCurveToPoint()添加二次曲線
8、內(nèi)存中繪圖
步驟1:調(diào)用UIGraphicsBeginImageContext(CGSize size)準備繪圖環(huán)境
步驟2:調(diào)用UIGraphicsGetCurrentContext()獲取繪圖CGContextRef
步驟3:使用前面介紹的幾何圖形、路徑等函數(shù)進行繪圖
步驟4:調(diào)用UIGraphicsGetImageFromCurrentImageContext()函數(shù)獲取當前繪制圖形,返回一個UIImage對象
步驟5:調(diào)用UIGraphicsEndImageContext()結束繪圖,關閉繪圖環(huán)境
UIRectFill(CGRect rect):向當前繪圖環(huán)境所創(chuàng)建的內(nèi)存中的圖片填充一個矩形
UIRectFillUsingBlendMode(CGRect rect, CGBlendModel blendModel):向當前繪圖環(huán)境所創(chuàng)建的內(nèi)存中的圖片填充一個矩形,繪制時使用指定的混合模式
UIRectFrame(CGRect rect):向當前繪圖環(huán)境所創(chuàng)建的內(nèi)存中的圖片繪制一個矩形邊框
UIRectFrameUsingBlendMode(CGRect rect, CGBlendModel blendModel):向當前繪圖環(huán)境所創(chuàng)建的內(nèi)存中的圖片繪制一個矩形邊框,繪制時使用指定的混合模式
9、繪制位圖
為了繪制位圖,UIImage本身提供以下方法:
1、-DrawAtPoint:將該圖片本身繪制到當前CGContextRef的指定點,該函數(shù)必須傳入一個指定點
2、-DrawAtPoint:blendMode:alpha:將該圖片本身繪制到當前CGContextRef的指定點,該函數(shù)必須傳入一個指定點,指定繪制圖片的疊加模式和透明度
3、-DrawInRect:將該圖片本身繪制到當前CGContextRef的指定區(qū)域,必須傳入CGRect參數(shù)
4、-DrawInRect:blendMode:alpha:將該圖片本身繪制到當前CGContextRef的指定區(qū)域,必須傳入CGRect參數(shù),指定繪制圖片的疊加模式和透明度
如果希望對圖片執(zhí)行旋轉等變換,則可借助一下函數(shù)來繪制圖片
1、CGContextDrawImage(CGContextRef c, CGRect rect, CGImageRef Image):將Image繪制到指定Rect區(qū)內(nèi)
2、CGContextDrawTiledImage(CGContextRef c, CGRect rect, CGImageRef image):采用‘平鋪’模式將image繪制到指定Rect區(qū)域內(nèi)
如果需要‘挖取’已有圖片部分或全部,則可用以下函數(shù):
1、CGImageCreatCopy(CGImageRef image):創(chuàng)建image圖片副本
2、CGImageCreatWithImageInRect(CGImageRef image, CGRect rect):挖取image中指定區(qū)域rect
三、圖形變換
1、坐標變換
CGContextTranslateCTM(CGContextRef? _Nullable c, CGFloat tx, CGFloat ty):平移坐標系統(tǒng)
CGContextScaleCTM(CGContextRef? _Nullable c, CGFloat sx, CGFloat sy)縮放坐標系統(tǒng)
CGContextRotateCTM(CGContextRef? _Nullable c, CGFloat angle)旋轉坐標系統(tǒng)
CGContextSaveGState(CGContextRef? _Nullable c)保存當前繪圖狀態(tài)
CGContextRestoreGState(CGContextRef? _Nullable c)恢復之前保存的繪圖狀態(tài)
2、矩陣變換
CGContextConcatCTM(CGContextRef? _Nullable c, CGAffineTransform transform)使用transform變換矩陣對CGContextRef的坐標系執(zhí)行變換,通過矩陣可以對坐標系統(tǒng)執(zhí)行任意變換。
CGContextGetCTM(CGContextRef? _Nullable c)獲取CGContextRef的變換矩陣
CGAffineTransformMakeTranslation(CGFloat tx, CGFloat ty)創(chuàng)建進行位移變換的變換矩陣
CGAffineTransformScale(CGAffineTransform t, CGFloat sx, CGFloat sy)創(chuàng)建進行縮放變換的變換矩陣。
CGAffineTransformMakeRotation(CGFloat angle)創(chuàng)建進行旋轉變換的變換矩陣
CGAffineTransformMake(CGFloat a, CGFloat b, CGFloat c, CGFloat d, CGFloat tx, CGFloat ty)自定義變換矩陣執(zhí)行變換
對已有矩陣進行額外變換
CGAffineTransformTranslate(CGAffineTransform t, CGFloat tx, CGFloat ty)對已有變換矩陣t額外增加位移變換
CGAffineTransformScale(CGAffineTransform t, CGFloat sx, CGFloat sy)對已有變換矩陣t額外增加縮放變換
CGAffineTransformRotate(CGAffineTransform t, CGFloat angle)對已有變換矩陣t額外增加旋轉變換
CGAffineTransformInvert(CGAffineTransform t)對已有變換矩陣t進行反轉
CGAffineTransformConcat(CGAffineTransform t1, CGAffineTransform t2)將兩個變換矩陣進行疊加
對點、矩形等幾何形狀進行變換
CGPointApplyAffineTransform(CGPoint point, CGAffineTransform t)對指定CGpoint執(zhí)行變換,函數(shù)返回坐標變換后的CGpoint
CGSizeApplyAffineTransform(CGSize size, CGAffineTransform t)對指定CGSize執(zhí)行變換,函數(shù)返回坐標變換后的CGSize
CGRectApplyAffineTransform(CGRect rect, CGAffineTransform t)對指定CGRect執(zhí)行變換,函數(shù)返回坐標變換后的CGRect
3、控制疊加模式
CGContextSetBlendMode(CGContextRef? _Nullable c, CGBlendMode mode)設置CGContextRef繪圖環(huán)境的疊加模式
UIRectFillUsingBlendMode(CGRect rect, CGBlendMode blendMode)
UIRectFrameUsingBlendMode(CGRect rect, CGBlendMode blendMode)
4、處理填充
CGContextDrawLinearGradient(CGContextRef? _Nullable c, CGGradientRef? _Nullable gradient, CGPoint startPoint, CGPoint endPoint, CGGradientDrawingOptions options)設置線性漸變填充,gradient代表漸變對象,startPoint線性漸變起點,endPoint線性漸變結束點,options支持kCGGradientDrawsBeforeStartLocation(擴展填充起點之前的區(qū)域)或者kCGGradientDrawsAfterEndLocation(擴充填充結束點之后的區(qū)域)
CGContextDrawRadialGradient(CGContextRef? _Nullable c, CGGradientRef? _Nullable gradient, CGPoint startCenter, CGFloat startRadius, CGPoint endCenter, CGFloat endRadius, CGGradientDrawingOptions options)設置圓形漸變填充,gradient漸變對象,startCenter參數(shù)設置起始點的圓心,startRadius參數(shù)設置起始點半徑,endCenter參數(shù)設置結束圓圓心,endRadius參數(shù)設置結束圓半徑,options支持kCGGradientDrawsBeforeStartLocation(擴展填充起點之前的區(qū)域)或者kCGGradientDrawsAfterEndLocation(擴充填充結束點之后的區(qū)域)
CGGradientCreateWithColorComponents(CGColorSpaceRef? _Nullable space, const CGFloat * _Nullable components, const CGFloat * _Nullable locations, size_t count)space指定顏色變換空間,CGFloat用于根據(jù)不同顏色空間設置多種顏色,locations指定各顏色點分布位置,count指定該漸變包含多少種顏色
Quartz 2D允許采用兩種方式來填充:
使用CGColorCreateWithPattern()函數(shù)創(chuàng)建代表填充的CGColorRef,接下來使用顏色填充指定區(qū)域或繪制邊框
首先創(chuàng)建CGPatternRef:(代表模式填充的引用),接下來繪制時調(diào)用CGContextSetFillPattern()或CGContextSetStrokePattern()函數(shù)設置填充或繪制邊框的模式
1、創(chuàng)建代表模式填充的顏色
》定義繪制填充的回調(diào)函數(shù),該函數(shù)通過CGContextRef執(zhí)行任意繪制,但必須遵守void函數(shù)名(void *info,CGContextRef context)的簽名
》使用前面創(chuàng)建的函數(shù)創(chuàng)建CGPatternCallbacks結構體數(shù)據(jù)
》以CGPatternCallbacks結構體作為參數(shù),調(diào)用CGPatternCreate()函數(shù)創(chuàng)建CGPatternRef。
》調(diào)用CGColorSpaceCreatePattern()函數(shù)用于模式填充顏色空間。該函數(shù)返回CGColorSpaceRef
》以前面創(chuàng)建的CGPatternRef、CGColorSpaceRef為參數(shù),調(diào)用CGColorCreateWithPattern()函數(shù)創(chuàng)建一個代表模式填充的顏色:CGColorRef。
2、使用CGPatternRef設置模式填充
程序無需創(chuàng)建代表模式填充的UIColorRef,只需創(chuàng)建代表模式填充的CGPatternRef,然后在繪制時使用CGContextSetFillPattern()或CGContextSetStrokePattern()函數(shù)設置使用模式進行填充或繪制路徑即可
使用CGPatternRef設置模式填充步驟如下:
》定義繪制填充的回調(diào)函數(shù),該函數(shù)必須遵守void函數(shù)名(void *info,CGContextRef context)的簽名。該函數(shù)可通過CGContextRef參數(shù)執(zhí)行繪制-但只繪制形狀,無需指定顏色
》使用前面創(chuàng)建的函數(shù)創(chuàng)建CGPatternCallbacks結構體
》以CGPatternCallbacks結構體作為參數(shù),調(diào)用CGPatternCreate()函數(shù)創(chuàng)建CGPatternRef。
》繪制時調(diào)用CGContextSetFillColorSpaces()函數(shù)設置使用模式填充的顏色空間
》繪制時調(diào)用CGContextSetFillPattern()或CGContextSetStrokePattern()函數(shù)設置使用指定的模式執(zhí)行填充或繪制
四、濾鏡
Core Image的三個核心API:
1、CIContext:它是Core Image處理的核心API,所有圖片的處理都是在它的管理下完成的。
2、CIFilter:它代表過濾器。所有的過濾器都由該CIFilter代表,在創(chuàng)建CIFilter時傳入不同參數(shù)即可創(chuàng)建不同類型的過濾器。
3、CIImage:代表Core Image過濾器處理的圖片,CIFilter過濾器的輸入圖片、輸出圖片都由該CIImage代表。程序可通過UIImage、圖片文件或像素數(shù)據(jù)來創(chuàng)建CIImage。
1、創(chuàng)建CIContext:
》基于CPU的CIContext、基于OpenGL優(yōu)化的CIContext
2、創(chuàng)建CIFilter過濾器。
3、創(chuàng)建CIImage對象,該CIImage將要作為過濾器的源圖片。
4、調(diào)用CIFilter的[filter setValue:beginImage forKey:@“inputImage”]方法為inputImage屬性賦值,該屬性用于指定該過濾器將要處理的源圖片。
5、根據(jù)需要,為不同的過濾器設置不同過濾參數(shù)。
6、調(diào)用CIFilter的outputImage屬性獲取過濾器處理后的圖片,返回的時CIImage對象。
7、調(diào)用CIContext的不同方法將CIImage轉換為CGImageRef,或者將該CIImage繪制到指定區(qū)域
五、動畫
1、Core Animation動畫基礎
Core Animation是一組非常強大的動畫處理API,使用它能做出非常炫麗的動畫效果,而且往往是事半功倍。Core Animation動畫使用CALayer來創(chuàng)建用戶界面。
Core Animation動畫在單獨的線程中完成,不會阻塞主線程。
Core Animation動畫只會重繪界面上變化部分(局部刷新)
Core Animation動畫的核心是CALayer。
CAAnimation是所有動畫類的基類,它實現(xiàn)了CAMedia Timing協(xié)議,提供了動畫的持續(xù)時間、速度和重復計數(shù)等。
CATransition:CAAnimation的子類,CATransition可通過預置的過度效果來控制CALayer層的過度動畫。
CAPropertyAnimation:CAAnimation的子類,代表屬性動畫,可通過+animationWithKeyPath:類方法來創(chuàng)建屬性動畫實例,該方法需要制定一個CALayer支持動畫的屬性,然后通過它的子類(CABasicAnimation、CAKeyframeAnimation)控制CALayer的動畫屬性慢慢改變,即可實現(xiàn)CALayer動畫。
CABasicAnimation:CAPropertyAnimation的子類,簡單控制CALayer層屬性慢慢改變,從而實現(xiàn)動畫效果。
CAKeyframeAnimation:CAPropertyAnimation的子類,支持關鍵幀的屬性動畫,該動畫最大的特點在于可通過values屬性指定多個關鍵幀,通過關鍵幀可以指定動畫各個階段的關鍵值。
CAAnimtaionGroup:CAAnimation的子類,用于多個動畫組合在一起執(zhí)行。
CAAnimation提供了以下方法和屬性:
1、BOOL removedOnCompletion;該屬性指定該動畫完成時是否從目標CALayer上刪除該動畫。
?2、timingFunction;該屬性指定一個CAMedia TimingFunction對象,該對象負責控制動畫變化步長。
3、- (void)animationDidStart:(CAAnimation *)aim:動畫開始時將會調(diào)用該方法
4、- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag:動畫結束時調(diào)用該方法。