在内存中绘图
来源:互联网 发布: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下的图片如下:
哈哈,效果是不是很显著哦,以后如果想自己绘制一些图标用代码实现也是可以的哦,
- 在内存中绘图
- 在内存中绘图
- GDI+在内存中绘图
- VC在内存中绘图
- 在内存绘图并保存为图片格式
- 利用HDC在内存上绘图
- 利用HDC在内存上绘图
- 数据在内存中各种形式
- 在内存中加载DLL
- 对象在内存中结构
- float在内存中存储
- Bitmap在内存中加载
- 在内存中显示位图
- iOS图像处理(6)在内存上下文中绘图
- 【IOS 开发学习总结-OC-66】Quartz 2D绘图(4-3)——绘制曲线+在内存中绘图+绘制位图
- 怎样在内存缓冲中画图(zz)
- 在内存中运行可执行程序
- 在内存中实现zip解压缩
- HLS-M3U8相关规范(草案)
- 第11讲 项目2----分离各位数
- Prime Ring Problem
- 关闭mac的SIP机制
- 从HttpClient到HttpURLConnection你需要知道的一些事情
- 在内存中绘图
- 基于内容的音频场景分割
- cacti安装配置
- bash FAQ
- Android ViewPage禁止重复加载
- 《剑指Offer》面试题:用两个队列实现一个栈
- matlab小结
- 打印空心菱形的解析法
- Java程序员应该了解的10个面向对象设计原则