美文网首页
iOS图像处理

iOS图像处理

作者: 小凡凡520 | 来源:发表于2018-07-29 22:59 被阅读116次
    概述

    iOS支持两套图形API族:Core Graphics/QuartZ 2D 和OpenGL ES。OpenGL ES是跨平台的图形API,属于OpenGL的一个简化版本。QuartZ 2D是苹果公司开发的一套API,它是Core Graphics Framework的一部分,是一套基于C的API框架,使用了Quartz作为绘图引擎。它提供了低级别、轻量级、高保真度的2D渲染。该框架可以用于基于路径的绘图、变换、颜色管理、脱屏渲染,模板、渐变、遮蔽、图像数据管理、图像的创建、遮罩以及PDF文档的创建、显示和分析。

    OpenGL ES是应用程序编程接口,该接口描述了方法、结构、函数应具有的行为以及应该如何被使用的语义。也就是说它只定义了一套规范,具体的实现由设备制造商根据规范去做。因为制造商可以自由的实现Open GL ES,所以不同系统实现的OpenGL ES也存在着巨大的性能差异。

    Core Graphics API所有的操作都在一个上下文中进行。所以在绘图之前需要获取该上下文并传入执行渲染的函数中。如果你正在渲染一副在内存中的图片,此时就需要传入图片所属的上下文。获得一个图形上下文是我们完成绘图任务的第一步,你可以将图形上下文理解为一块画布。如果你没有得到这块画布,那么你就无法完成任何绘图操作

    UIKit和Core Graphics
    • Core Graphics上下文

    使用Core Graphics之前需要指定一个用于绘图的图形上下文(CGContextRef),这个图形上下文会在每个绘图函数中都会被用到。如果你持有一个图形上下文context:参数,那么你等同于有了一个图形上下文,这个上下文也许就是你需要用来绘图的那个。三种获得图形上下文的方法(drawRect:、drawRect: inContext:、UIGraphicsBeginImageContextWithOptions)。

    第一种方法就是创建一个图片类型的上下文。调用UIGraphicsBeginImageContextWithOptions函数就可获得用来处理图片的图形上下文。利用该上下文,你就可以在其上进行绘图,并生成图片。调用UIGraphicsGetImageFromCurrentImageContext函数可从当前上下文中获取一个UIImage对象。记住在你所有的绘图操作后别忘了调用UIGraphicsEndImageContext函数关闭图形上下文。

    第二种方法是利用cocoa为你生成的图形上下文。当你子类化了一个UIView并实现了自己的drawRect:方法后,一旦drawRect:方法被调用,Cocoa就会为你创建一个图形上下文,此时你对图形上下文的所有绘图操作都会显示在UIView上。如果当前处于UIGraphicsBeginImageContextWithOptions函数或drawRect:方法中,并没有引用一个上下文。为了使用Core Graphics,你可以调用UIGraphicsGetCurrentContext函数获得当前的图形上下文。

    • UIKit绘图

    第一种绘图,在UIView的子类方法drawRect:中绘制一个蓝色圆,使用UIKit在Cocoa为我们提供的当前上下文中完成绘图任务

    - (void) drawRect: (CGRect) rect { 
    
    UIBezierPath* p = [UIBezierPathbezierPathWithOvalInRect:CGRectMake(0,0,100,100)]; 
    
    [[UIColor blueColor] setFill]; 
    
    [p fill]; 
    
    }
    

    第二种绘图,将在UIView子类的drawLayer:inContext:方法中实现绘图任务。drawLayer:inContext:方法是一个绘制图层内容的代理方法。为了能够调用drawLayer:inContext:方法,我们需要设定图层的代理对象。但要注意,不应该将UIView对象设置为显示层的委托对象,这是因为UIView对象已经是隐式层的代理对象,再将它设置为另一个层的委托对象就会出问题。轻量级的做法是:编写负责绘图形的代理类。

    @interface MyLayerDelegate : NSObject 
    
    @end 
    
    @implementation MyLayerDelegate 
    
    - (void)drawLayer:(CALayer*)layer inContext:(CGContextRef)ctx { 
    
    UIGraphicsPushContext(ctx); 
    
    UIBezierPath* p = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0,0,100,100)]; 
    
      [[UIColor blueColor] setFill]; 
    
    [p fill]; 
    
    UIGraphicsPopContext(); 
    
    } 
    
    @end
    

    第三种绘图

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(100,100), NO, 0);     
    
    UIBezierPath* p = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0,0,100,100)]; 
    
    [[UIColor blueColor] setFill]; 
    
    [p fill]; 
    
    UIImage* im = UIGraphicsGetImageFromCurrentImageContext(); 
    
    UIGraphicsEndImageContext();
    
    • Core Graphics绘图

    第一种绘图

    - (void) drawRect: (CGRect) rect { 
    
    CGContextRef con = UIGraphicsGetCurrentContext(); 
    
    CGContextAddEllipseInRect(con, CGRectMake(0,0,100,100)); 
    
    CGContextSetFillColorWithColor(con, [UIColor blueColor].CGColor); 
    
    CGContextFillPath(con); 
    
    }
    

    第二种绘图

    - (void)drawLayer:(CALayer*)lay inContext:(CGContextRef)con { 
    
    CGContextAddEllipseInRect(con, CGRectMake(0,0,100,100)); 
    
    CGContextSetFillColorWithColor(con, [UIColor blueColor].CGColor); 
    
    CGContextFillPath(con); 
    
    }
    

    第三种绘图

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(100,100), NO, 0); 
    
    CGContextRef con = UIGraphicsGetCurrentContext(); 
    
    CGContextAddEllipseInRect(con, CGRectMake(0,0,100,100)); 
    
    CGContextSetFillColorWithColor(con, [UIColor blueColor].CGColor); 
    
    CGContextFillPath(con); 
    
    UIImage* im = UIGraphicsGetImageFromCurrentImageContext(); 
    
    UIGraphicsEndImageContext();
    
    • OpenGL ES绘图

    相关文章

      网友评论

          本文标题:iOS图像处理

          本文链接:https://www.haomeiwen.com/subject/gzttvftx.html