图形图象及动画

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);
图形图象及动画_第1张图片
img

六个参数对应矩阵的前两列。

- (void)transformImageView

{

CGAffineTransform t = CGAffineTransformMakeScale(scale * previousScale,

scale * previousScale);

t = CGAffineTransformRotate(t, rotation + previousRotation);

self.imageView.transform = t;

}

// 绘制复杂的图形,必须启用路径


图形图象及动画_第2张图片

在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:

你可能感兴趣的:(图形图象及动画)