Quartz2D---苹果官方的⼆维绘图引擎(绘制基本图形)

iOS开发UI篇—Quartz2D使用(绘制基本图形)

一、简单说明

Quartz 2D:是⼀个苹果官方的⼆维绘图引擎,同时支持iOS和Mac OS X系统(跨平台,Quartz 2D的API纯 C 语⾔的)。包含在 Core Graphics 框架中Cocos 2D :(Cocos2D-x、Cocos2D-iPhone、Cocos2D-HTML5等), Cocos2D 是一个 第三⽅开源的2D游戏框架。做2D 游戏的 还有 Sprite Kit。 一般3D 游戏用 unity3D。


只有在当前view的drawRect才能获取图形上下文对象;手动无法保证有系统创建好的的图形上下文对象,手动调用重绘
获取图形上下文是同一个方法,因此谁开的谁关闭

drawRect啥时候被调用?:1、当View第一次显示到屏幕上时调用一次(加到UIWindow上显示出来) 2、重绘的时候:调用View的setNeedsDisplay或setNeedsDisplayInRect时


   绘图能用OC对象就不用C语言,绘制的东西其实是绘制到view的 。能用UIView就不要自己绘图

1、C语言绘图(直接调用Quartz 2D的API):1、获取   图形上下文(Graphics Context)对象CGContextRef:(参数rect是当前view的大小)  2、向对象中添加路径  3、渲染CGCnoextStroke

2、OC对象绘图(调用UIkit框架封装好的API绘图):UIBezierPath对象可以独立使用(内部自动获取),无需手动获取图形上下文对象
把路径(UIBezierPath 创建)添加到  图形上下文( CGContextRef ctx = UIGraphicsGetCurrentContext();可以不用获取)对象中 ,,渲染(绘制路径)Stroke/  创建路径,渲染


1、绘制圆角矩形    圆角半径超过边长一半的2/3就是


两种填充方式:非零绕数规则(方向有关(画圆),次数无关),(奇偶填充规则),奇数次 填充

在UIView上绘图:在drawRect:方法中取得上下⽂文后(它能保存绘图信息,并且决定着绘制到什么地⽅去),就可以绘制东西到view上
1、获取与UIView相关的图形上下文---View内部有个layer(图层) 属性,drawRect:⽅方法中取得的是⼀一 个Layer Graphics Context,因此, 绘制的东西其实是绘制到view的layer上 去了View能显示东西,完全是因为内部的layer

⾃定义view的步骤
➢ 新建⼀个类,继承自UIView
➢ 实现- (void)drawRect:(CGRect)rect⽅法,然后在这个⽅法中 ● 取得跟当前view相关联的图形上下⽂
● 绘制相应的图形内容
● 利用图形上下⽂将绘制的所有内容渲染显⽰示到view上⾯




图形上下文(Graphics Context):是一个CGContextRef类型的数据

图形上下文的作用:保存绘图信息、绘图状态

决定绘制的输出目标(绘制到什么地方去?)(输出目标可以是PDF文件、Bitmap或者显示器的窗口上)

相同的一套绘图序列,指定不同的Graphics Context,就可将相同的图像绘制到不同的目标上。

Quartz2D提供了以下几种类型的Graphics Context:

1、Bitmap Graphics Context

2、PDF Graphics Context

3、Window Graphics Context

4、Layer Graphics Context

5、Printer Graphics Context

只要上下文不同,绘制的地方就不同。

本文说明如何把图片绘制到Bitmap上面去,即要求生成一张图片,图片上面保存了绘图信息。

Bitmap就是图片,相当于系统的UIimage。一个UIImage就是一个Bitmap

 

二、怎么把图片绘制到Bitmap上?

注意:不能在drawRect:方法中直接获取Bitmap的上下文,需要我们自己进行创建。

代码示例:

 1 //
 2 //  YYViewController.m
 3 //  06-绘制基本图形
 4 //
 5 //  Created by apple on 14-6-22.
 6 //  Copyright (c) 2014年 itcase. All rights reserved.
 7 //
 8 
 9 #import "YYViewController.h"
10 
11 @interface YYViewController ()
12 @property (weak, nonatomic) IBOutlet UIImageView *iv;
13 @end
14 
15 @implementation YYViewController
16 
17 - (void)viewDidLoad
18 {
19     [super viewDidLoad];
20 
21     //加载图片
22     //0.创建一个Bitmap上下文
23     //c语言的方法
24 //    CGBitmapContextCreate(<#void *data#>, <#size_t width#>, <#size_t height#>, <#size_t bitsPerComponent#>, <#size_t bytesPerRow#>, <#CGColorSpaceRef space#>, <#CGBitmapInfo bitmapInfo#>)
25     //oc中封装的方法
26     //方法1
27 //    UIGraphicsBeginImageContext(<#CGSize size#>);
28     //方法2
29     UIGraphicsBeginImageContextWithOptions( CGSizeMake(200, 200), NO, 0);
30     //1.获取bitmap上下文
31     CGContextRef ctx = UIGraphicsGetCurrentContext();
32     //2.绘图(画一个圆)
33     CGContextAddEllipseInRect(ctx, CGRectMake(0, 0, 100, 100));
34     //3.渲染
35     CGContextStrokePath(ctx);
36     //4.获取生成的图片
37     UIImage *image=UIGraphicsGetImageFromCurrentImageContext();
38     //5.显示生成的图片到imageview
39     self.iv.image=image;
40     //6.保存绘制好的图片到文件中
41     //先将图片转换为二进制数据,然后再将图片写到文件中
42 //    UIImageJPEGRepresentation(image, 1); //第二个参数为保存的图片的效果
43     NSData *data=UIImagePNGRepresentation(image);
44     [data writeToFile:@"/Users/apple/Desktop/abc.png" atomically:YES];
45 }
46 
47 - (void)didReceiveMemoryWarning
48 {
49     [super didReceiveMemoryWarning];
50     // Dispose of any resources that can be recreated.
51 }
52 
53 @end

程序执行效果:

程序执行完毕后,会在指定的位置创建一个abc.png的图片

补充说明:

1.创建Bitmap图形上下文的方法

  //方法1   UIGraphicsBeginImageContext(<#CGSize size#>);

  //方法2 UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale)

使用两个方法同样都可以创建,但是使用第一个方法将来创建的图片清晰度和质量没有第二种方法的好。
方法2接收三个参数:

CGSize size:指定将来创建出来的bitmap的大小

BOOL opaque:设置透明YES代表透明,NO代表不透明

CGFloat scale:代表缩放,0代表不缩放

创建出来的bitmap就对应一个UIImage对象

 

2.Quartz2D的内存管理

使用含有“Create”或“Copy”的函数创建的对象,使用完后必须释放,否则将导致内存泄露

使用不含有“Create”或“Copy”的函数获取的对象,则不需要释放

如果retain了一个对象,不再使用时,需要将其release掉

可以使用Quartz 2D的函数来指定retain和release一个对象。例如,如果创建了一个CGColorSpace对象,则使用函数CGColorSpaceRetain和CGColorSpaceRelease来retain和release对象。

也可以使用Core Foundation的CFRetain和CFRelease。注意不能传递NULL值给这些函数 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章