zoukankan      html  css  js  c++  java
  • IOS图像处理(6)在内存上下文中绘图

    之前提过绘制图像首先需要取得图形上下文对象(CGContextRef),系统中维护一个CGContextRef的栈,在UI控件的drawRect方法调用前,系统会为当前绘图环境创建一个图形上下文对象并且置于CGContextRef栈顶,通过UIGraphicsGetCurrentContext()可以取得这个图像上下文对象。我们也可以创建自己的图像上下文对象,quartz 2d提供了相应的api给开发者创建各种上下文对象,当我们使用UIKit在IOS内存中绘图时,创建上下文的工作更加简单,只需要调用UIGraphicsBeginImageContextWithOptions即可创建一个基于内存绘图的上下文

    - (void)drawRect:(CGRect)rect
    {
        //创建一个基于位图的上下文(context),并将其设置为当前上下文(context)
        //绘图区域大小 | 是否透明 | 缩放因子
        //UIGraphicsBeginImageContextWithOptions(rect.size, YES, 1);
        
        //透明度默认YES 缩放因子1.0
        UIGraphicsBeginImageContext(rect.size);
        
        
        //获取图像上下文对象
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetFillColorWithColor(context, [UIColor magentaColor].CGColor);
        CGContextSetStrokeColorWithColor(context, [UIColor greenColor].CGColor);
        
        //绘制椭圆
        CGContextStrokeRect(context, CGRectMake(20, 20, 100, 100));
        
        //绘制矩形
        CGContextFillEllipseInRect(context, CGRectMake(150, 20, 100, 100));
        
        //绘制文字
        [@"this is a jok" drawAtPoint:CGPointMake(20, 150) withAttributes:@{NSFontAttributeName:[UIFont fontWithName:@"Arial" size:30],NSForegroundColorAttributeName:[UIColor redColor]}];
        
        //获取绘图上下文中的图片
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        
        //结束绘图
        UIGraphicsEndImageContext();
        
        //将图片显示到界面上
        [image drawInRect:rect];
        
        //图片存储到沙盒中
        NSString *path = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"pic.png"];
        NSLog(@"%@",path);
        [UIImagePNGRepresentation(image) writeToFile:path atomically:YES];
    }

     

    从上例中我们可以看到,在内存中绘图的步骤和在view上绘图的步骤完全一样,内存中绘制完图片后也可以显示到视图上,或者存储到应用沙盒中,使用内存绘图的上下文,我们可以很方便的实现绘图板的功能

    @implementation ZLTView {
        CGPoint _firstPoint;
        CGPoint _lastPoint;
        CGContextRef _imageContext;
        UIImage *_image;
    }
    
    - (id)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            
            UIGraphicsBeginImageContext(self.frame.size);
            _imageContext = UIGraphicsGetCurrentContext();
            
            CGContextSetStrokeColorWithColor(_imageContext, [UIColor purpleColor].CGColor);
            CGContextSetLineWidth(_imageContext, 5);
        }
        return self;
    }
    
    
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
        UITouch *touch = [touches anyObject];
        CGPoint touchPoint = [touch locationInView:self];
        _firstPoint = touchPoint;
    }
    
    - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
        UITouch *touch = [touches anyObject];
        CGPoint touchPoint = [touch locationInView:self];
        _lastPoint = touchPoint;
        
        
        CGContextMoveToPoint(_imageContext, _firstPoint.x, _firstPoint.y);
        CGContextAddLineToPoint(_imageContext, _lastPoint.x, _lastPoint.y);
        CGContextDrawPath(_imageContext, kCGPathStroke);
        _image = UIGraphicsGetImageFromCurrentImageContext();
    
        [self setNeedsDisplay];
        _firstPoint = _lastPoint;
    }
    
    - (void)drawRect:(CGRect)rect{
        [_image drawInRect:rect];
    }

     

  • 相关阅读:
    springcloud 项目源码 微服务 分布式 Activiti6 工作流 vue.js html 跨域 前后分离
    springcloud 项目源码 微服务 分布式 Activiti6 工作流 vue.js html 跨域 前后分离
    OA办公系统 Springboot Activiti6 工作流 集成代码生成器 vue.js 前后分离 跨域
    java企业官网源码 自适应响应式 freemarker 静态引擎 SSM 框架
    java OA办公系统源码 Springboot Activiti工作流 vue.js 前后分离 集成代码生成器
    springcloud 项目源码 微服务 分布式 Activiti6 工作流 vue.js html 跨域 前后分离
    java 视频播放 弹幕技术 视频弹幕 视频截图 springmvc mybatis SSM
    最后阶段总结
    第二阶段学习总结
    第一阶段学习总结
  • 原文地址:https://www.cnblogs.com/zanglitao/p/4037051.html
Copyright © 2011-2022 走看看