在内存中绘图

来源:互联网 发布:oracle sql rollup 编辑:程序博客网 时间:2024/05/17 22:16

前面介绍的都是通过扩展 UIView,重写drawRect:方法进行绘图,这种绘图方式是直接在 UIView 控件上绘制所有的图形 由于每次该控件显示出来时,drawRect:方法都会被调用,这意味着每次该控件显示出来时,程序都需要重绘所有的图形,很明显,这种方式的性能并不好。除此之外,总有些时候需要在内存中绘制图片,这样既可导出到手机本地,也可上传到网络上。

与直接在UIView控件上绘图不同,在内存中绘图时,需要开发这自己准备绘图环境,Quartz 2D 提供了一个非常便捷的函数:UIGraphicsBeginImageContext(CGsize size),该函数用于准备绘图环境。当图形绘制完成后,可调用UIGraphicsEndImageContext()函数结束绘图和关闭绘图环境。
总结来说,在内存中绘图的步骤如下。
1) 调用UIGraphicsBeginImageContext(CGSize size)函数准备绘图环境。
2)调用UIGraphicsGetCurrentContext()函数获取绘图CGContextRef。
3)用前面介绍的绘制集合图形、是用路径等方式进行绘图。
4)调用UIGraphicsGetImageFromCurrentImageContext()函数获取当前绘制的图形,该方法返回一个UIImage对象。
5)调用UIGraphicsEndImageContext()函数结束绘图,并关闭绘图环境。

除了使用前面介绍需要CGContextRef参数的方法绘图之外,还可调用如下函数进行绘图。
a, UIRectFill(CGRect rect):向当前绘图环境所创建的内存中的图片上填充一个矩形。
b,UIRectFillUsingBlendMode(CGRect rect,CGBlendMode blendMode): 向当前绘图环境所创建的内存中的图片上填充一个矩形,绘制使用指定的混合模式。
c, UIRectFrame(CGRect rect): 向当前绘图环境所创建的内存中的图片绘制一个矩形边框。
d,UIRectFrameUsingBlendMode(CGRect rect,CGBlendMode blendMode): 向当前绘图环境所创建的内存中的图片上绘制一个矩形边框,绘制使用指定的混合模式。

示例代码如下:

- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view, typically from a nib.    self.view.backgroundColor =[UIColor whiteColor];    UIImageView *imageView = [[UIImageView alloc] initWithImage:[self drawImage:CGSizeMake(self.view.frame.size.width, self.view.frame.size.height)]];    imageView.frame =self.view.frame;    [self.view addSubview:imageView];}-(UIImage *)drawImage:(CGSize)size{    UIGraphicsBeginImageContext(size);       //创建内存中的图片    CGContextRef ctx =UIGraphicsGetCurrentContext();    CGContextSetLineWidth(ctx, 8);     //设置线宽    //---------------下面开始向内存中绘制图形---------    CGContextSetRGBStrokeColor(ctx, 0, 1, 0, 1);  //设置线条颜色    CGContextStrokeRect(ctx, CGRectMake(30, 30, 120, 60));  //绘制一个矩形边框    CGContextSetRGBFillColor(ctx, 1, 1, 0, 1);          //设置填充颜色    CGContextFillRect(ctx, CGRectMake(180, 30, 120, 60));  //绘制一个矩形边框    CGContextSetRGBStrokeColor(ctx, 0, 1, 1, 1);           //设置线条颜色    //绘制一个椭圆    CGContextStrokeEllipseInRect(ctx, CGRectMake(30, 120, 120, 60));    CGContextSetRGBFillColor(ctx, 1, 0, 1, 1);   //设置填充颜色    CGContextFillEllipseInRect(ctx, CGRectMake(180, 120, 120, 60));    //填充一个椭圆     //获取该绘图Context中的图片    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();    //结束绘图----------    UIGraphicsEndImageContext();    //获取当前应用路径中Documents目录下的制定文件名对应的文件路径    NSString *path = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"newPng.png"];    NSLog(@"path   %@",path);    //保存PNG图片    [UIImagePNGRepresentation(newImage) writeToFile:path atomically:YES];    return newImage;}

运行结果如下图:
这里写图片描述

保存在documents下的图片如下:
这里写图片描述

哈哈,效果是不是很显著哦,以后如果想自己绘制一些图标用代码实现也是可以的哦,

0 0
原创粉丝点击