`
linwwwei
  • 浏览: 224325 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

CGContext理解(参考)

 
阅读更多

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

场景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];

 

 

参考地址:http://www.cocoachina.com/industry/20140115/7703.html

分享到:
评论

相关推荐

    使用CGContext画线

    在"lianxitu-dApps-Net"这个项目中,可能包含了一系列关于使用CGContext画线的示例代码和应用,可以参考这些示例加深对CGContext绘线的理解和实践。通过不断练习和探索,你将能够熟练地使用Core Graphics框架来创建...

    绘图之dome

    “绘图之dome”中的代码应该包含了详细的注释,这对于初学者理解每个绘图步骤的作用至关重要。通过阅读这些注释,你可以学习到如何将理论知识应用到实际的编程实践中。 总之,“绘图之dome”是一个极好的资源,...

    IOS应用源码——图片倒影.rar

    这份"图片倒影.rar"压缩包文件很可能包含了实现这一功能的源代码,这对于iOS开发者来说是一个宝贵的参考资料。下面我们将详细探讨如何在iOS应用中创建图片倒影以及相关的技术点。 首先,iOS开发主要使用Swift或...

    IOS应用源码——相机+画板.zip

    总的来说,这个源码包将涉及iOS的多媒体处理、图形绘制、用户交互、模型管理和权限管理等多个方面,对于学习和理解iOS应用开发具有很高的参考价值。通过分析和研究这些代码,开发者可以更好地掌握iOS应用中相机与...

    CG2.0参考手册(reference manual)

    ### CG2.0参考手册知识点概述 #### 一、CG简介 CG是一种为GPU编程而设计的高级编程语言,能够跨平台、支持多种API。它主要用于编写图形处理单元(GPU)上的可编程部分的指令集。尽管CG程序具有高度灵活性,它们在...

    手写画图.zipIOS应用例子源码下载

    手写画图.zip是一个针对iOS平台的应用程序源码示例,提供了丰富的学习资源,适合不同层次的学习者,包括学生、个人开发者以及公司技术团队进行研究和参考。这个源码库不仅能够帮助初学者理解iOS应用的基本构建,还能...

    多张图片拼接为一张大图, 效果可参考微信群组头像 iOS

    标题提到的项目"多张图片拼接为一张大图, 效果可参考微信群组头像",是由作者changjianfeishui提供的开源代码库MGXStitchImage。这个库为我们提供了一个方便的方式来实现这一功能。 MGXStitchImage项目主要包含以下...

    IOS应用源码Demo-一个画板-毕设学习.zip

    标题中的“IOS应用源码Demo-一个画板-毕设...通过深入分析和学习这个源代码,开发者不仅能掌握iOS应用的基本开发技能,还能提升对用户交互处理、图形编程和数据管理的理解,为自己的毕业设计或论文提供有价值的参考。

    IOS应用源码——SYCompositor.rar

    源码中会展示如何使用CGContext进行绘制,包括颜色混合、透明度处理、图像拉伸等操作。 3. **自定义Layer** 在SYCompositor中,开发者可能创建了自己的CALayer子类,以满足特定的渲染需求。这包括自定义渲染回调、...

    IOS应用源码——圆形百分比图表.zip

    开发者可以参考这个图片,理解代码实现的最终视觉表现,并根据自己的需要调整源码。 而`说明.txt`文件很可能是对项目的一份简要介绍或使用指南,包含了如何导入和使用这个库的说明,以及可能存在的问题和解决方法。...

    Quartz2D绘制五角星

    在提供的压缩包文件"Quartz2DDrawStar"中,可能包含了实现这个功能的完整代码示例,你可以参考并运行这些代码,以便更直观地理解上述步骤。同时,你还可以通过调整参数,例如线条宽度、颜色,以及尝试添加填充等效果...

    IOS应用源码——多种风格的RoundSwitch.zip

    开发者可以参考这些子类,学习如何使用Core Graphics(CGContext)进行绘图,或者利用UIKit框架中的视图属性来自定义视图外观。例如,改变borderWidth、borderColor、tintColor等属性,就可以轻松改变RoundSwitch的...

    IOS应用源码Demo-饼状图代码cakyTest-毕设学习.zip

    这为学习者提供了更全面的理解和参考。 总之,这个源码Demo是学习iOS应用开发,特别是饼状图绘制和交互的一个宝贵资源。通过分析和理解源码,开发者可以深入了解Core Graphics、UIKit框架的应用,以及如何在iOS应用...

    IOS应用源码——图片放大镜效果.rar

    这个“IOS应用源码——图片放大镜效果.rar”压缩包提供了一个实现这一功能的示例代码,对于iOS开发者来说,它是一个学习和参考的好资源。 首先,我们要理解图片放大镜效果的基本原理。在iOS中,这种效果通常通过...

    DrawDemo2绘图源码_ios源码

    DrawDemo2是一个专为iOS平台设计的绘图示例项目,它为我们提供了深入理解Core Graphics框架和CALayer类的机会。本文将详细解析DrawDemo2源码,探讨其中涉及的图形绘制技术和关键知识点。 1. Core Graphics基础:...

    给图片添加水印

    在iOS开发中,给图片添加水印...这个名为“ImageWithWaterMark”的项目应该包含了实现这些功能的源代码,你可以参考学习,理解并扩展其功能以满足更复杂的需求。通过实践和调试,你将更好地掌握在iOS中添加水印的技术。

    ios-swift版本声波图.zip

    总的来说,这个项目是一个很好的示例,展示了如何在Swift中利用贝塞尔曲线进行视图动画设计,特别是对于那些希望在自己的iOS应用中加入动态视觉元素的开发者来说,这是一个非常有价值的参考资料。通过深入研究和实践...

    IOS应用源码Demo-圆形时钟-毕设学习.zip

    在这个项目中,开发者可能会使用CGContext来创建一个圆形路径,并设置填充和描边颜色,然后通过定时器每隔一定时间更新界面,使时钟指针随着实际时间转动。 时间处理是另一个关键部分。iOS中的日期和时间管理通常...

    IOS应用源码Demo-圆环状的按钮,类似于ipod下面的实体键-毕设学习.zip

    这个项目对于学习iOS开发,尤其是毕业设计阶段的学生来说,是一份非常有价值的参考资料。 首先,我们需要了解这个源码是如何实现圆环状按钮的。在iOS中,我们通常会用到Core Graphics(CG)框架来绘制自定义图形,...

    IOS应用源码——自定义的马赛克时间风格.zip

    在iOS开发中,自定义UI是提升应用独特性和用户体验的重要环节。这个"自定义的马赛克时间风格"源码示例就是一个很好的实践,它展示了如何在iOS应用中...对于有志于iOS开发的程序员来说,这是一份非常有价值的参考资料。

Global site tag (gtag.js) - Google Analytics