CGContext又叫图形上下文,相当于一块画布,以堆栈形式存放,只有在当前 context上绘图才有效。iOS有分多种图形上下文,其中UIView自带提供的在drawRect:方法中通过 UIGraphicsGetCurrentContext获取,还有专门为图片处理的context,UIGraphicsBeginImageContext函数生成,还有pdf的context等等。

1.一共有3种使用context的场景,其中每种场景都有2种方法绘图

场景1:

//通过UIView的子类的drawRect:在上下文中绘制,该方法系统已准备好一个cgcontext,并放置在上下文栈顶,rect形参就是context的尺寸大小
//当一个UIView的backgroundColor为nil和opaque为YES时,产生的context的背景就为黑色的
- (void)drawRect:(CGRect)rect
{
    //1.使用UIKit在context上绘制,UIKit的所有操作只会在当前栈顶的context,所以需要注意当前栈顶的context是否你需要操作的上下文
    //UIImage,NSString,UIBezierPath,UIColor等可以直接在当前context上操作
    UIImage* image = [UIImage imageNamed:@"test.png"];
    NSLog(@"size:%@",NSStringFromCGSize(image.size));
    //UIImage直接在context上操作,指定在context的哪个坐标上绘制,大小是原图的尺寸,如果大小超出了context的范围就会被截取掉
   // [image drawAtPoint:CGPointMake(100, 100)];
    //指定在context的哪个坐标上绘制,并指定绘制的图片尺寸大小,这样图片的尺寸就会被压缩,不会超出context范围
    [image drawInRect:CGRectMake(0, 0, rect.size.width/2, rect.size.height/2)];

//2.使用Core Graphics的函数在context上绘制,Core Graphics的函数需要context作为参数,只绘制在指定使用的context上
    //功过UIGraphicsGetCurrentContext函数获取当前上下文栈顶的context,UIView系统已为其准备好context并存放在栈顶了
//    CGContextRef context = UIGraphicsGetCurrentContext();
//    //画一个椭圆
//    CGContextAddEllipseInRect(context, CGRectMake(0,0,100,100));
//    //填充颜色为蓝色
//    CGContextSetFillColorWithColor(context, [UIColor blueColor].CGColor);
//    //在context上绘制
//    CGContextFillPath(context);

场景2:

//实现该方法,用于CALayer回调,CALayer通过它的代理类来进行绘图操作,切记千万不能把UIView作为CALayer的代理类,因为UIView自身有隐式的图层,若再把显式的图层赋给它会发生不知名错误的
- (void)drawLayer:(CALayer*)layer inContext:(CGContextRef)ctx
{
    //1.使用UIKit进行绘制,因为UIKit只会对当前上下文栈顶的context操作,所以要把形参中的context设置为当前上下文
    UIGraphicsPushContext(ctx);
    UIImage* image = [UIImage imageNamed:@"test.png"];
    //指定位置和大小绘制图片
    [image drawInRect:CGRectMake(0, 0,100 , 100)];
    UIGraphicsPopContext();
    
    //    UIGraphicsPushContext(ctx);
    //2.使用Core Graphics进行绘制,需要显式使用context
    //    //画一个椭圆
    //    CGContextAddEllipseInRect(ctx, CGRectMake(0,0,100,100));
    //    //填充颜色为蓝色
    //    CGContextSetFillColorWithColor(ctx, [UIColor blueColor].CGColor);
    //    //在context上绘制
    //    CGContextFillPath(ctx);
    //    UIGraphicsPopContext();
}

LayerDelegate* delegate = [[LayerDelegate alloc]init];
    CALayer* layer = [CALayer layer];
    layer.anchorPoint = CGPointMake(0, 0);
    layer.position = CGPointMake(100, 100);
    layer.bounds = CGRectMake(0, 0, 200, 200);
    layer.delegate = delegate;
    //需要显式调用setNeedsDisplay来刷新才会绘制layer
    [layer setNeedsDisplay];
    [self.view.layer addSublayer:layer];

下图为场景1和场景2的显示效果:

场景3:

//通过自己创建一个context来绘制,通常用于对图片的处理
    /*
     解释一下UIGraphicsBeginImageContextWithOptions函数参数的含义:第一个参数表示所要创建的图片的尺寸;第二个参 数用来指定所生成图片的背景是否为不透明,如上我们使用YES而不是NO,则我们得到的图片背景将会是黑色,显然这不是我想要的;第三个参数指定生成图片 的缩放因子,这个缩放因子与UIImage的scale属性所指的含义是一致的。传入0则表示让图片的缩放因子根据屏幕的分辨率而变化,所以我们得到的图 片不管是在单分辨率还是视网膜屏上看起来都会很好。
     */
    //该函数会自动创建一个context,并把它push到上下文栈顶,坐标系也经处理和UIKit的坐标系相同
    UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextAddEllipseInRect(context, CGRectMake(0,0,100,100));
    //填充颜色为蓝色
    CGContextSetFillColorWithColor(context, [UIColor blueColor].CGColor);
    //在context上绘制
    CGContextFillPath(context);
    //把当前context的内容输出成一个UIImage图片
    UIImage* i = UIGraphicsGetImageFromCurrentImageContext();
    //上下文栈pop出创建的context
    UIGraphicsEndImageContext();
    [i drawInRect:CGRectMake(0, 0, 100, 100)];

下图为绘制的显示效果:

2.把整个屏幕转化为图片

UIImageView* imageV = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    UIGraphicsBeginImageContextWithOptions(imageV.frame.size, NO, 0);
    CGContextRef context = UIGraphicsGetCurrentContext();
    //把当前的整个画面导入到context中,然后通过context输出UIImage,这样就可以把整个屏幕转化为图片
    [self.view.layer renderInContext:context];
    UIImage* image = UIGraphicsGetImageFromCurrentImageContext();
    imageV.image = image;
    UIGraphicsEndImageContext();

3.剪裁图片

//对一张图片进行剪裁
    CGImageRef imageref = CGImageCreateWithImageInRect(image.CGImage, CGRectMake(100, 100, 200, 50));
    UIImageView* cropImage = [[UIImageView alloc]initWithFrame:CGRectMake(100, 300, 200, 50)];
    cropImage.image = [UIImage imageWithCGImage:imageref];

CGImageRelease(imageref);

[self.view addSubview:cropImage];

下图下放的是剪裁后的图片效果:

CGContext的更多相关文章

  1. CGContext 的一些工具方法

    /* *设置虚线 *param context CGContext *param context CGContext *param lineDashLengths 如: const CGFloat l ...

  2. (转)IOS开发之——绘图(CGContext)

    周刊 更多 登录   IOS开发之——绘图(CGContext) 时间 2014-04-21 09:17:43 CSDN博客 原文  http://blog.csdn.net/zhenyu521131 ...

  3. CoreGraphics --- CGContext

    CGContext又叫图形上下文,相当于一块画布,以堆栈形式存放,只有在当前context上绘图才有效.iOS有分多种图形上下文,其中UIView自带提供的在drawRect:方法中通过UIGraph ...

  4. IOS开发之——绘图(CGContext)

    0 CGContextRef context = UIGraphicsGetCurrentContext(); 设置上下文 1 CGContextMoveToPoint 开始画线 2 CGContex ...

  5. iOS之CGcontext.h方法和属性简介

    /* CoreGraphics - CGContext.h Copyright (c) 2000-2012 Apple Inc. All rights reserved. */ #ifndef CGC ...

  6. 自定义圆饼(利用贝塞尔曲线和CGContext类完成)

    -(void)drawRect:(CGRect)rect{ CGFloat w = self.bounds.size.width; CGFloat h = self.bounds.size.heigh ...

  7. CGContext 解释

    Managing Graphics Contexts:管理图形上下文 CGContextFlush // 强制立即渲染未执行在一个窗口上下文上的绘图操作到目标设备.系统会在合适的时机自动调用此函数,手 ...

  8. CGContext绘图

    0 CGContextRef context = UIGraphicsGetCurrentContext(); 设置上下文 1 CGContextMoveToPoint 开始画线 2 CGContex ...

  9. CoreGraphics之CGContext绘图

    0  CGContextRef context = UIGraphicsGetCurrentContext(); 设置上下文 
1 CGContextMoveToPoint 开始画线
 2 CGCon ...

随机推荐

  1. OpenGL ES 2.0 雾

    在场景中使用雾不但可以提高真实感,特定的情况下还能优化性能.具体是指当物体离摄像机足够远时,雾就足够浓,此时只能看到雾而看不到物体,也就不必对物体着色进行详细计算,这样可以大大提高渲染效率. 雾有很多 ...

  2. Android成长记(1)-----android环境搭建与adb shell 命令

    整理一下学习android一步一步存下来的自己总结或是从网上摘抄的比较不错的文档,电脑要上交了,最舍不得的就是自己积累的这么点东西了,所以决定发布到黎梓小站,以供大家一起学习以及自己日后忘记了也有地方 ...

  3. jquery 1.9 之后toggle不能用的问题

    今天用到toggle这个方法,发现不是自己想要的效果,之前有用过好多次,一直都没有问题. 网上查了原因,才知道是版本的问题,jquery1.9之后toggle取消了.那么如果想要继续用toggle的这 ...

  4. 在java中生成二维码,并直接输出到jsp页面

    在java中生成的二维码不存到磁盘里要直接输出到页面上,这就需要把生成的二维码直接以流的形式输出到页面上,我用的是myeclipse 和 tomcat 它的原理是:在加载页面时,根据img的src(c ...

  5. Manasa and Stones

    from __future__ import print_function def main(): t = int(raw_input()) for _ in range(t): n = int(ra ...

  6. HMVC

    HMVC(Hierarchical-Model-View-Controller),也可以叫做 Layered MVC.顾名思义,就是按等级划分的 MVC 模式,简单的解释就是把MVC又细分成了多个子 ...

  7. 网络版shell之网络编程练习篇--telnet服务端

    网络版shell之网络编程练习篇--telnet服务端   以前写过一个shell命令解释器,对与shell命令解释器的执行流程有了清晰的认识,这段时间学习网络编程,至于网络编程的细节以及知识点,已经 ...

  8. Linux下串口编程入门

    简介: Linux操作系统从一开始就对串行口提供了很好的支持,本文就Linux下的串行口通讯编程进行简单的介绍. 串口简介  串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用.常用 ...

  9. POJ Oulipo (KMP)

    题目大意 : 在一个字符串中找出目标单词的个数 代码: #include<iostream> #include<cstdio> #include<cstdlib> ...

  10. OpenstackHigh-level-service

    1,yum -y install openstack-cinder;