• 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];
    }

     

  • 相关阅读:
    标签和过滤器
    【android】简单的布局和控件&简单的练习作品
    【android】配置模拟器以及第一个“Hello World!”
    【android】sdk安装及环境变量配置、android studio的安装及新建项目
    【javaweb】库存物资管理系统思路与总结
    【java】关于异常处理的思考
    【作业】对于对象的课程作业
    【作业】神奇的代码,包装类Integre,100==100,129!=129
    【作业】随机数+参数可变的方法+实验任务(输出素数+使用递归,判断是否为回文+统计一篇英语问斩单词出现频率)
    【作业】三个关于java的探索和两个实验题
  • 原文地址:https://www.cnblogs.com/zanglitao/p/4037051.html
Copyright © 2020-2023  润新知