• Graphics总结


    获得context

    UIView的drawRect方法中:

    UIGraphicsGetCurrentContext();

    创建画布,获得context。最常用的imageContext:

    UIGraphicsBeginImageContextWithOptions(annoImage.size, NO, 0.0);
    
    CGContextRef context = UIGraphicsGetCurrentContext();

     

    各种绘图

    线条颜色、填充颜色、线条宽度、虚线、线条形状等

    CGContextStrokePath时候,线条颜色和填充颜色生效。

    (两种颜色不能同时生效,所以如果想同时有填充颜色和线条颜色,需要画两次?)

    - (UIImage *)drawImage{
        UIGraphicsBeginImageContext(CGSizeMake(202, 202));
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetRGBStrokeColor(context, 1, 1, 1, 0xa0/255.0);//线条颜色
        CGContextSetLineWidth(context, 1.0);//线条宽度
        CGContextAddRect(context, CGRectMake(0,0, 202, 202));
        CGContextStrokePath(context);
        
        CGContextSetFillColorWithColor(context, [UIColor greenColor].CGColor);//填充颜色
        CGContextFillRect(context, CGRectMake(0, 0, 15, 2));
        CGContextFillRect(context, CGRectMake(0, 0, 2, 15));
        CGContextFillRect(context, CGRectMake(202-15, 0, 15, 2));
        CGContextFillRect(context, CGRectMake(202-2, 0, 2, 15));
        CGContextFillRect(context, CGRectMake(0, 202-2, 15, 2));
        CGContextFillRect(context, CGRectMake(0, 202-15, 2, 15));
        CGContextFillRect(context, CGRectMake(202-15, 202-2, 15, 2));
        CGContextFillRect(context, CGRectMake(202-2, 202-15, 2, 15));
        CGContextStrokePath(context);
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return image;
    }

    CGContextSetLineCap 设置线条终点形状  

    CGContextSetLineDash 画虚线  

     

    画矩形

    1.使用系统方法直接画矩形:

    CGContextAddRect(context, CGRectMake(0,0, 202, 202));//画矩形边框
    CGContextFillRect(context, CGRectMake(0, 0, 15, 2));//画实心矩形
    

    2.画path:

    通过CGContextMoveToPoint、CGContextAddLineToPoint绘制。绘制完成后CGContextClosePath,然后使用CGContextStrokePath填充颜色。

    画弧线

    1.CGContextAddArcToPoint

    - (void)getDrawPath:(CGContextRef)context//自定义annotation calloutView的边框
    {
        CGContextSetStrokeColorWithColor(context, [UIColor lightGrayColor].CGColor);
        CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
        CGContextSetLineWidth(context, 0.5);
        CGRect rrect = self.bounds;
        CGFloat radius = 10;
        
        CGFloat minx = CGRectGetMinX(rrect),
        midx = CGRectGetMidX(rrect),
        maxx = CGRectGetMaxX(rrect);
        CGFloat miny = CGRectGetMinY(rrect),
        // midy = CGRectGetMidY(rrect),
        maxy = CGRectGetMaxY(rrect)-Arror_height;
        CGContextMoveToPoint(context, midx+Arror_height, maxy);
        CGContextAddLineToPoint(context,midx, maxy+Arror_height);
        CGContextAddLineToPoint(context,midx-Arror_height, maxy);
        
        CGContextAddArcToPoint(context, minx, maxy, minx, miny, radius);
        CGContextAddArcToPoint(context, minx, miny, maxx, miny, radius);
        CGContextAddArcToPoint(context, maxx, miny, maxx, maxx, radius);
        CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius);
        CGContextAddLineToPoint(context, midx+Arror_height, maxy);
        
        CGContextFillPath(context);
        CGContextClosePath(context);
        
        CGContextMoveToPoint(context, midx+Arror_height, maxy);
        CGContextAddLineToPoint(context,midx, maxy+Arror_height);
        CGContextAddLineToPoint(context,midx-Arror_height, maxy);
        
        CGContextAddArcToPoint(context, minx, maxy, minx, miny, radius);
        CGContextAddArcToPoint(context, minx, miny, maxx, miny, radius);
        CGContextAddArcToPoint(context, maxx, miny, maxx, maxx, radius);
        CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius);
    //    CGContextAddLineToPoint(context, midx+Arror_height, maxy);
        CGContextClosePath(context);
        CGContextStrokePath(context);
    }

    CGContextAddArcToPoint:当前点到第一个点的线、与第一个点到第二个点的线相交,然后画弧线。当前点与弧线连接,第二个点与弧线不连接,弧线结束即结束。

    2.CGContextAddArc

    - (UIImageView *)createShadowImageView{//创建渐变颜色的扇形
        UIGraphicsBeginImageContextWithOptions(CGSizeMake(self.view.frame.size.height*1.1/2, self.view.frame.size.height*1.1/2), NO, 0.0);
        CGContextRef context = UIGraphicsGetCurrentContext();
        
        CGPoint center = CGPointMake(self.view.frame.size.width/2, self.view.frame.size.height/2);
        for (int i = 0; i < 90; i++){
            CGContextSetRGBFillColor(context, 1, 1, 1, (i/90.0)*0.2);
            CGContextMoveToPoint(context, 0, 0);
            CGContextAddArc(context, 0, 0, center.y*1.1, i*(M_PI/180), (i+1)*(M_PI/180), 0);
            CGContextClosePath(context);
            CGContextFillPath(context);
        }
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        UIImageView *imageView = [[UIImageView alloc]initWithImage:image];
        return imageView;
    } 

    CGContextAddArc(CGContextRef c, CGFloat x, CGFloat y, CGFloat radius, CGFloat startAngle, CGFloat endAngle, int clockwise)。colckwize为方向。

    画椭圆、正圆

    CGContextAddEllipseInRect、CGContextFillEllipseInRect

    画图片 

    画VIEW

    [imageView.layer renderInContext:context];

    [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES];

    Context的处理

     缩小图片并截取成圆形(截取矩形类似操作)

    画出形状后,CGContextClip,再画的内容都在形状的范围内才画出了。

    - (UIImage *)getSmallImage{
        UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 57, 57)];
        imageView.image = selectedImage;
        
        UIGraphicsBeginImageContextWithOptions(CGSizeMake(57, 57), NO, 0.0);
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextAddEllipseInRect(context, CGRectMake(0, 0, 57, 57));
        CGContextClip(context);
        [imageView.layer renderInContext:context];
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return image;
    }
    

    挖空

    CGContextClearRect(context, rect);

    挖一个圆形

    首先Clip一个圆形,然后ClearRect。

        CGContextAddEllipseInRect(context, r);
        CGContextClip(context);
        CGContextClearRect(context, r);
    

    从context的某个位置开始绘图

    - (UIImage*)createImageWithPic:(UIImageView*)pic inImage:(UIImage*)annoImage{//在annotation上添加照片
        UIGraphicsBeginImageContextWithOptions(annoImage.size, NO, 0.0);
        CGContextRef context = UIGraphicsGetCurrentContext();
    
        [annoImage drawInRect:CGRectMake(0, 0, annoImage.size.width, annoImage.size.height)];
        CGContextTranslateCTM(context, 4.1, 1.6);
        [pic.layer renderInContext:context];
        CGContextTranslateCTM(context, -4.1, -1.6);
    
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return image;
    }

    CGContextTranslateCTM(context, 4.1, 1.6),修改原点,则绘图的起始位置为{4.1,1.6}。绘制完成后调用CGContextTranslateCTM(context, -4.1, -1.6)。

    截取图片,返回截取到的图片

    - (void)setBackground{
        UIImage *image = [UIImage imageNamed:@"image_health_bkg.png"];
        UIImageView *imageView = [[UIImageView alloc]initWithImage:image];
        imageView.frame = [UIScreen mainScreen].bounds;
        UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, 0.0);
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextTranslateCTM(context, 0, -64);
        [imageView.layer renderInContext:context];
    //    CGContextTranslateCTM(context, 0, 64);
        image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        self.layer.contents = (id)image.CGImage;
        return;
    }
    

     图片比VIEW大,要把上边儿部分截去64。建立一个VIEW大小的context,CGContextTranslateCTM(context, 0, -64)让绘图原点从{0,-64}开始,再画图就可以了。

    imagePicker获取最终截取的图片

            UIScrollView *scrollView = (UIScrollView *)[self findView:testViewController.view withName:@"PLImageScrollView"];
            UIView *imageView = [self findView:testViewController.view withName:@"PLExpandableImageView"];
            
            CGPoint contentOffset = scrollView.contentOffset;
            double scale = imageView.transform.a;
            double x = imageView.frame.origin.x;
            double y = imageView.frame.origin.y;
            
            UIGraphicsBeginImageContextWithOptions(CGSizeMake(self.view.frame.size.width/scale, self.view.frame.size.width/scale), NO, 0.0);
            CGContextRef context = UIGraphicsGetCurrentContext();
            CGContextTranslateCTM(context, -(contentOffset.x - x)/scale, -(contentOffset.y+124-y)/scale);
            [originalimage drawInRect:CGRectMake(0, 0, originalimage.size.width, originalimage.size.height)];
            CGContextTranslateCTM(context, (contentOffset.x- x)/scale, (contentOffset.y+124-y)/scale);
            selectedImage = UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();
    

     

  • 相关阅读:
    poj2492A Bug's Life
    poj2912Rochambeau
    poj1062昂贵的聘礼
    poj3169Layout(差分约束)
    poj2240Arbitrage
    poj1502MPI Maelstrom
    poj3259Wormholes
    1/8=1/a+1/b,a,b为自然数
    目录查找
    待删除未删除 问题解决
  • 原文地址:https://www.cnblogs.com/zhongriqianqian/p/4134306.html
Copyright © 2020-2023  润新知