绘图Quartz2D

绘图Quartz2D

什么是图形上下文,它是用来保存用户绘制好的内容状态,当我们选择与哪一个View相关联的时候,那么它就根据那个view来输出.(类似画板)

仿射变换

 //仿射变换: 此处是先把上下文旋转、缩放、平移了, 然后后面再绘制的
所有图形就都是在旋转、缩放、平移之后的上下文中进行了(意思可以理解为
以左上角这个点做相关的变换,相对于ZLView),并且注意,仿射变换不能放
在向上下文添加路径之后,已经添加了,不会发生改变. 
 CGContextRotateCTM(ctx, M_PI_4);//旋转90度
// CGContextScaleCTM(ctx, 0.5, 0.5);//缩放0.5
// CGContextTranslateCTM(ctx, 100, 0);//x轴平移100

上下文栈

上下文栈 就是保存 最后一次 绘图的状态 (颜色, 样式, 矩阵)

•图形上下文栈是什么? –每一个“图形上下文”对象都包含一个“栈”结构,这个栈结构用来存储当前图形上下文的状态信息。(每个图形上下文对象中都包含:1>“图形状态”; 2> 路径信息; 3> 输出目标)

•1. 为什么要学习图形上下文栈? –1. 第一次画图后修改了颜色, 后面的图形要再恢复到原来的颜色 –2. 第一次画图的时候旋转了上下文, 后面的图形不要旋转 –3. 第一次画图的时候修改了线宽,线头样式等,后面画图的时候不要这些样式,要默认的样子 – – •总结:前面绘图的时候修改了上下文,后面绘图的时候要再次使用被修改前的上下文对象

总结:渲染对栈的状态起作用,如果你想让不同的东西恢复默认效果,每一个部分你都要进行渲染,并在这之前,恢复你保存的上下文状态.


 //---------保存栈的状态--------------------- 
 CGContextSaveGState(ctx);
 //-----------恢复你保存的上下文状态-------------
 CGContextRestoreGState(ctx);

内存管理和静态分析

//静态分析 product ------> Anlyze ------> shift+com+B

//只能检测出一部分

  1. 凡是遇到 retain 、 copy 、 create 出的对象, 都需要进行 release
  2. 但是CGPathCreateMutable()不是 OC 方法, 所以不是调用 某个对象的 release方法
  3. CGXxxxxCreate 对应的就有 CGXxxxxRelease。
  4. 通过 CFRelease(任何类型);可以释放任何类型。前提是属于Core Foundation

学会静态分析,以及在画图中存在的内存泄露问题.没有被释放.解决办法:

//释放

// CGPathRelease(path);

 //Core Foundation

// CFRelease(path);


注意:CGContextRelease(ctx); 并不能使用,因为是path创建造成的内
存泄漏,只有释放path,而不是context.

绘制文字

  1. 设置内容
  2. 绘制
    1.从坐标点开始绘制,不会换行
    2.从rect 开始绘制, 会换行
 //设置换行 
// [str drawAtPoint:CGPointZero withAttributes:nil];//单行,不会换行
// [str drawInRect:rect withAttributes:nil];//多行,会自动换行

绘制图片

  1. 设置图片
  2. 以什么方式绘制
 //绘制图片 
// [img drawAtPoint:CGPointZero];以坐标点开始
// [img drawInRect:rect];以rect为范围
// [img drawAsPatternInRect:rect]; 平铺 (用小图片 拼接 成背景图) 

模拟UIImageView

创建一个继承自UIView的控件在内部,绘制图片.
[img drawInRect:rect];以rect为范围

创建一个这个类的对象,设置图片,就可以了

裁剪图片

//限制上下文的显示区域 (** clip限制上下文显示区域 **)
CGContextClip(ctx);

bitmap

先裁剪后绘制图片.再获取才裁剪的图片.

-------------前面是图形(可以画的)的,下面是图片(显示图片的)的上下文-----------------

获取图片上下文
  1. 开启环境
  2. 直接绘制图片(有渲染,系统渲染了)
  3. 获取图片
  4. 关闭环境(节省CPU,避免环境冲突)
  5. UIImageWrite(保存相册).
  6. 保存本地文件----未做.
获取裁剪完毕的图片

[path addClip];

带圆环的图像

  1. 注意圆环时的上下文环境,应该加上两个间距(上下左右)
  2. 绘制第一个圆环,加上线宽和和颜色,渲染.

CGFloat radius = MIN(img.size.width, img.size.height)*0.5; 可能是矩形,去宽或高中小的一半,作为半径.

  1. 绘制第二个圆环.渲染
  2. 裁剪上下文(第二个路径裁剪就可以了,最新路径)
  3. 绘制图片
  4. 获取带圆环的图片
  5. 关闭图片上下文
  6. 保存

带水印的图像

  1. 一张图片
  2. 开启图片上下文环境
  3. 获取图片路径
  4. 绘制文字(draw...)
  5. 绘制logo
  6. 获取带水印的图片
  7. 关闭上下文环境
  8. 保存带相册中
 //开启图片上下文环境 
 UIGraphicsBeginImageContextWithOptions(img.size, NO, 0);
 //关闭上下文路径 
 UIGraphicsEndImageContext();
 //保存到相册中 
 UIImageWriteToSavedPhotosAlbum(waterImg, nil, nil, nil);

 //截屏的方法

UIImageI是属性用strong,他不是控件,不能用weak.一些UI开头的属性,他并不是控件,不能用weak修饰.

你可能感兴趣的:(绘图Quartz2D)