绘图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
//只能检测出一部分
- 凡是遇到 retain 、 copy 、 create 出的对象, 都需要进行 release
- 但是CGPathCreateMutable()不是 OC 方法, 所以不是调用 某个对象的 release方法
- CGXxxxxCreate 对应的就有 CGXxxxxRelease。
- 通过 CFRelease(任何类型);可以释放任何类型。前提是属于Core Foundation
学会静态分析,以及在画图中存在的内存泄露问题.没有被释放.解决办法:
//释放
// CGPathRelease(path);
//Core Foundation
// CFRelease(path);
注意:CGContextRelease(ctx); 并不能使用,因为是path创建造成的内
存泄漏,只有释放path,而不是context.
绘制文字
- 设置内容
- 绘制
1.从坐标点开始绘制,不会换行
2.从rect 开始绘制, 会换行
//设置换行
// [str drawAtPoint:CGPointZero withAttributes:nil];//单行,不会换行
// [str drawInRect:rect withAttributes:nil];//多行,会自动换行
绘制图片
- 设置图片
- 以什么方式绘制
//绘制图片
// [img drawAtPoint:CGPointZero];以坐标点开始
// [img drawInRect:rect];以rect为范围
// [img drawAsPatternInRect:rect]; 平铺 (用小图片 拼接 成背景图)
模拟UIImageView
创建一个继承自UIView的控件在内部,绘制图片.
[img drawInRect:rect];以rect为范围
创建一个这个类的对象,设置图片,就可以了
裁剪图片
//限制上下文的显示区域 (** clip限制上下文显示区域 **)
CGContextClip(ctx);
bitmap
先裁剪后绘制图片.再获取才裁剪的图片.
-------------前面是图形(可以画的)的,下面是图片(显示图片的)的上下文-----------------
获取图片上下文
- 开启环境
- 直接绘制图片(有渲染,系统渲染了)
- 获取图片
- 关闭环境(节省CPU,避免环境冲突)
- UIImageWrite(保存相册).
- 保存本地文件----未做.
获取裁剪完毕的图片
[path addClip];
带圆环的图像
- 注意圆环时的上下文环境,应该加上两个间距(上下左右)
- 绘制第一个圆环,加上线宽和和颜色,渲染.
CGFloat radius = MIN(img.size.width, img.size.height)*0.5; 可能是矩形,去宽或高中小的一半,作为半径.
- 绘制第二个圆环.渲染
- 裁剪上下文(第二个路径裁剪就可以了,最新路径)
- 绘制图片
- 获取带圆环的图片
- 关闭图片上下文
- 保存
带水印的图像
- 一张图片
- 开启图片上下文环境
- 获取图片路径
- 绘制文字(draw...)
- 绘制logo
- 获取带水印的图片
- 关闭上下文环境
- 保存带相册中
//开启图片上下文环境
UIGraphicsBeginImageContextWithOptions(img.size, NO, 0);
//关闭上下文路径
UIGraphicsEndImageContext();
//保存到相册中
UIImageWriteToSavedPhotosAlbum(waterImg, nil, nil, nil);
//截屏的方法
网友评论