【IOS 开发学习总结-OC-67】Quartz 2D绘图(4-4)——图形变换+填充处理+core image 滤镜
Quartz 2D提供了坐标变换支持,这样开发的时候 我们不许繁琐计算每个点坐标,只需对坐标系统整体变换即可。
使用坐标变换
Quartz 2D坐标变换的方法:
1. CGContextTranslateCTM(<#CGContextRef _Nullable c#>, <#CGFloat tx#>, <#CGFloat ty#>)
——平移坐标系统;
2. CGContextScaleCTM(<#CGContextRef _Nullable c#>, <#CGFloat sx#>, <#CGFloat sy#>)
——缩放坐标系统;
3. CGContextRotateCTM(<#CGContextRef _Nullable c#>, <#CGFloat angle#>)
——旋转坐标系统
保存,恢复绘图状态的方法——进行坐标转换的时候无需计算多次坐标变换后的累加结果
CGContextSaveGState(<#CGContextRef _Nullable c#>)
——保存之前的绘图状态;CGContextRestoreGState(<#CGContextRef _Nullable c#>)
——恢复之前保存的绘图状态;
CGContextSaveGState(<#CGContextRef _Nullable c#>)
函数保存的绘图状态,不仅包括当前坐标系统的状态,还包括当前设置的填充风格,线条风格,阴影风格等各种绘图状态;但它不会保存当前绘制的图形。
坐标变换与路径结合使用
如果在坐标变换以后的坐标系统内创建路径,那么创建路径的每个点的坐标也是变换后 的结果。——整个路径都是基于”坐标变换”后的坐标系统。使用矩阵变换
CGContextConcatCTM(<#CGContextRef _Nullable c#>, <#CGAffineTransform transform#>)
——使用 transform 变换矩阵对CGContextRef坐标系统进行变换,通过坐标矩阵可以对坐标系统任意变换。CGContextGetCTM(<#CGContextRef _Nullable c#>)
——获取CGContextRef坐标系统的变换矩阵;
矩阵变换这部分内容网络上没有发现比较系统的讲解。个人推荐使用《疯狂 ios 》中相应的章节学习。
控制绘图的叠加模式
可以调用Quartz 2D提供的方法:
CGContextSetBlendMode(<#CGContextRef _Nullable c#>, <#CGBlendMode mode#>)
——设置该CGContextRef绘图环境的叠加模式;
处理填充
渐变填充
CGContextDrawLinearGradient(<#CGContextRef _Nullable c#>, <#CGGradientRef _Nullable gradient#>, <#CGPoint startPoint#>, <#CGPoint endPoint#>, <#CGGradientDrawingOptions options#>)
——设置渐变填充。Gradient,渐变对象;options支持kCGGradientDrawsAfterEndLocation
(扩展填充起始点之前的区域)或kCGGradientDrawsBeforeStartLocation
(扩展填充结束点之后的区域)CGContextDrawRadialGradient(<#CGContextRef _Nullable c#>, <#CGGradientRef _Nullable gradient#>, <#CGPoint startCenter#>, <#CGFloat startRadius#>, <#CGPoint endCenter#>, <#CGFloat endRadius#>, <#CGGradientDrawingOptions options#>)
——圆形渐变填充。
上面的函数中都用到CGGradientRef参数,代表渐变颜色,为了获取CGGradientRef,可用如下函数:
CGGradientCreateWithColorComponents(<#CGColorSpaceRef _Nullable space#>, <#const CGFloat * _Nullable components#>, <#const CGFloat * _Nullable locations#>, <#size_t count#>)`
——space:指定该渐变的颜色空间;components,根据不同的颜色空间,设置多种颜色;locations:指定各颜色点的分布位置(如果为 NULL, 各颜色点均匀分布);count,颜色数量。
模式填充
类似于铺瓷砖的方式填充。
还可以在使用模式填充时,指定瓷砖块之间的距离;也可对填充的瓷砖块使用旋转,缩放,镜像等各种变换。
执行模式填充的2种方式:
- 使用
CGColorCreateWithPattern(<#CGColorSpaceRef _Nullable space#>, <#CGPatternRef _Nullable pattern#>, <#const CGFloat * _Nullable components#>)
函数创建代表模式填充的 CGColorRef(颜色),接下来使用该颜色填充指定区域或绘制边框; - 先创建CGColorRef(模式填充的引用),然后在绘制时调用CGContextSetFillPattern函数或者CGContextStrokePath函数设置填充或者绘制边框的模式;
创建代表填充的颜色
CGColorRef代表一种具体的颜色,但此处它是一种特殊的颜色——代表模式填充的颜色。获取了这种颜色后,程序就可以使用它来填充区域,绘制路径。
使用 CGPatternRef设置模式填充
core image 滤镜
core image 可以用来开发移动版的 Photoshop.
core imaged的3个核心 API:
1. CIContext:——核心 API,所有的图片的处理都在它的管理下完成。
2. CIFiter:——代表过滤器。创建CIFiter时传入不同的参数即可创建不同类型的过滤器。
3. CIImage:——代表过滤器处理的图片。程序可以通过 UIImage,图片文件或像素数据来创建 CIImage.
在使用core image过滤器之前,一定要为项目增加core image框架。使用core image过滤的步骤如下:
补充学习资料:
1. iOS动效-利用CATransform3D实现翻页动画效果:http://www.jianshu.com/p/9cbf52eb39dd
2. http://blog.csdn.net/lvmaker/article/details/38385823