1、UIImage显示静止图片的类方法
* +imageNamed: 该方法有缓存机制,如果需要频繁的加载卸载图片时,不应该使用该方法
* + imageWithContentOfFile: 该方法加载指定文件名对应的图片
* + imageWithData:
* + imageWithData:scale: 指定缩放因子对图片进行缩放
* + imageWithCGImages:根据指定的CGImageRef对象来创建UIImage
* + imageWithCGImages:scale:orientation:
* + animatedImageNamed:duration: 根据指定的图片名在加载系列图片
* + animatedImageWithImages:duration: 该方法需要传入一个NSArray作为多张动画图片
动画效果
- CGAffineTransformMake
CGAffineTransform CGAffineTransformMake (
CGFloat a,
CGFloat b,
CGFloat c,
CGFloat d,
CGFloat tx,
CGFloat ty );
//创建一个给定比例放缩的变换
CGAffineTransformMakeScale (CGFloat sx, CGFloat sy);
CGAffineTransformMakeScale(-1.0, 1.0);//水平翻转
CGAffineTransformMakeScale(1.0,-1.0);//垂直翻转
//创建一个旋转角度的变化
CGAffineTransform CGAffineTransformMakeRotation ( CGFloat angle);
//创建一个平移的变化
CGAffineTransform CGAffineTransformMakeTranslation (CGFloat tx,CGFloat ty);
六个参数对应矩阵的前两列。
- (void)transformImageView
{
CGAffineTransform t = CGAffineTransformMakeScale(scale * previousScale,
scale * previousScale);
t = CGAffineTransformRotate(t, rotation + previousRotation);
self.imageView.transform = t;
}
// 绘制复杂的图形,必须启用路径
在Canvas(画布)中使用路径,可按如下步骤进行
- 1、调用CGContextBeginPath()函数开始定义路径
- 2、 调用表12.4所示的各种函数添加子路径
- 3、如果路径添加完成,调用CGContextClosePath()函数关闭路径
- 4、调用CGContextDrawPath()、CGContextEOFillPath()、CGContextFillPath()、CGContextStrokePath()函数来填充路径,或绘制路径边框,第一个方法可以替代后面几个,设置特定的模式
在内存中绘图
步骤如下
- 1、调用UIGraphicsBeginImageContext(<#CGSize size#>)函数准备绘图环境
- 2、UIGraphicsGetCurrentContext()函数获取绘图CGContextRef
- 3、用前面介绍的绘制集合图形、使用路径等方式进行绘图
- 4、UIGraphicsGetImageFromCurrentImageContext()获取当前绘制图形,该方法返回一个UIImage对象
- 5、UIGraphicsEndImageContext()结束绘图,并关闭绘图环境
图形变换
Quartz 2D提供如下坐标变换
- CGContextTranslateCTM(CGContextRef c, CGFloat tx, CGFloat ty),平移坐标系,把(0,0)位置的坐标原点平移到(tx,ty)
- CGContextScaleCTM(CGContextRef c, CGFloat sx, CGFloat sy)缩放sx,sy
- CGContextRotateCTM(CGContextRef c, CGFloat angle),旋转坐标angle弧度
- CGContextSaveGState(CGContextRef c) //保存当前的绘图状态
CGContextRestoreGState(CGContextRef c) // 恢复之前保存的绘图状态
使用矩阵变换
- CGContextConcatCTM(CGContextRef c, CGAffineTransform transform)通过坐标矩阵变换
- CGAffineTransform CGContextGetCTM(CGContextRef c)获取坐标系统的变换矩阵,CGAffineTransform t 代表变换矩阵
- 创建CGAffineTransform可以使用如下函数进行:
CGAffineTransformMakeTranslation(CGFloat tx, CGFloat ty);位移变换的矩阵
CGAffineTransformMakeScale(CGFloat sx, CGFloat sy)缩放变换
CGAffineTransformMakeRotation(CGFloat angle)角度变换
CGAffineTransformMake(CGFloat a, CGFloat b, CGFloat c, CGFloat d, CGFloat tx, CGFloat ty),该函数使用自定义变换矩阵,其中(a,b,c,d)将会组成变换矩阵,变换后实际坐标(xa + yc + tx, xb + yd + ty)
比如要进行水平镜像(绕Y轴做对称变化),此时变换矩阵为CGAffineTransformMake(-1, 0, 0, 1, 0, 0)
Core Image 滤镜
三个核心API
- CIContext:所有的图片处理都在它的管理下完成
- CIFilter:代表过滤器,在创建CIFilter时需要传入不同的参数即可创建不同类型的过滤器
- CIImage:代表处理的图片
使用例子
1.创建CIContext对象。有三种创建方式
// 第一种创建方式:基于CPU的CIContext对象
CIContext *ctx = [CIContext contextWithOptions:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],kCIContextUseSoftwareRenderer, nil]];
// 第二种创建方式:基于GPU的CIContext对象
ctx = [CIContext contextWithOptions:nil];
// 第三种方式:基于OpenGL优化的对象
EAGLContext *eaglctx = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
2.创建CIFilter过滤器,CIFilter提供了filterWithName:类方法来创建CIFilter对象,该方法需要传入过滤器的名字
滤镜名字查询
NSArray *names = [CIFilter filterNamesInCategory:kCICategoryBuiltIn];
NSLog(@"%@",names);
通过打印可以获取滤镜的所有名字
3.创建CIImage对象
4.调用CIFilter的setValue方法为inputImage属性复制
[filter setValue:image forKey:kCIInputImageKey];
[filter setValue:[CIColor colorWithRed:100/255 green:0.4 blue:1] forKey:kCIInputColorKey];
5.根据需要,为不同的滤镜设置不同的过滤参数
6.调用CIFilter的outputImage方法获取处理后的图片
Core Animation动画基础
使用core animaton创建动画,不仅简单而且具有更好的性能,原因如下:
- core animaton动画在单独的线程完成,不会阻塞主线程
- core animaton动画只会重绘界面上变化的部分(局部刷新)
Core Animation动画还涉及如下API
- CAAnimation:它是所有动画的基类
- CATransition:
- CAPropertyAnimation:属性动画
- CABasicAnimation: CAPropertyAnimation的子类
- CAKeyframeAnimation:
- CAAnimationGroup: