Core Graphics之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];

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值