美文网首页
iOS UIBezierPath裁剪图片

iOS UIBezierPath裁剪图片

作者: Zonpai | 来源:发表于2018-08-08 15:04 被阅读0次

    裁剪加边框

    - (void)viewDidLoad {
        [super viewDidLoad];
        UIImage *image = [UIImage imageNamed:@"add"];
        CGSize size = CGSizeMake(image.size.width+2*5, image.size.height+2*5);
        //开启上下文
        UIGraphicsBeginImageContextWithOptions(size, NO, 0);
        //设置背景图
        UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, size.width, size.height)];
        [[UIColor redColor] setFill];
        [path fill];
        //设置裁剪的图片
        UIBezierPath *path_two = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(5, 5, image.size.height, image.size.height)];
        //实现裁剪
        [path_two addClip];
        //把图片绘制到上下文中
        [image drawAtPoint:CGPointMake(5, 5)];
        //从上下文中取出图片
        UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
        //关闭上下文
        UIGraphicsEndImageContext();
        self.imageView.image = newImage;
    }
    
    效果图: 裁剪+设置边框.png

    模拟屏幕截图

    点击viewController的view会在桌面生成一张view的图片

    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        //把控制器的view生成一张图片
        //开启一个与当前控制器的view一样大小的上下文尺寸
        UIGraphicsBeginImageContextWithOptions([UIScreen mainScreen].bounds.size, NO, 0);
        //把控制器的view绘制到上下文当中
        //只能通过render的渲染的方式,用draw的方法画不出效果
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        [self.view.layer renderInContext:ctx];
        //从上下文当中获取图片
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    //    把生成的图片写入电脑做面(文件方式的传输:二进制NSData)
        NSData *data = UIImagePNGRepresentation(image);
        //或者
        //第二个参数设置为1则呈现的像素比较全面
    //    NSData *data = UIImageJPEGRepresentation(image, 1);
        [data writeToFile:@"/Users/apple/Desktop/view.png"
               atomically:YES];
    }
    
    桌面: 桌面生成屏幕截图.png

    伸缩截图

    //懒加载
    - (UIImageView *)coverView{
        if(!_coverView){
            UIImageView *imageView = [[UIImageView alloc] init];
            imageView.backgroundColor = [UIColor blackColor];
            imageView.alpha = 0.5;
            _coverView = imageView;
            [self.view addSubview:_coverView];
        }
        return _coverView;
    }
    - (void)viewDidLoad {
        [super viewDidLoad];
        //注意改变imageView的UserInteractionEnabled
        self.imageView.userInteractionEnabled = YES;
    }
    - (IBAction)panAction:(UIPanGestureRecognizer *)sender {
        CGPoint startPoint = [sender locationInView:self.imageView];
        if(sender.state == UIGestureRecognizerStateBegan){
            self.startPoint = startPoint;
        }else if(sender.state == UIGestureRecognizerStateChanged){
            CGPoint curPoint = [sender locationInView:self.imageView];
            //计算相对位移
            CGFloat sx = curPoint.x - self.startPoint.x;
            CGFloat sy = curPoint.y - self.startPoint.y;
            self.coverView.frame = CGRectMake(self.startPoint.x, self.startPoint.y, sx, sy);
        }else if (sender.state == UIGestureRecognizerStateEnded){
            UIGraphicsBeginImageContextWithOptions(self.imageView.frame.size, NO, 0);
            UIBezierPath *path = [UIBezierPath bezierPathWithRect:self.coverView.frame];
            [path addClip];
            CGContextRef ctx = UIGraphicsGetCurrentContext();
            [self.imageView.layer renderInContext:ctx];
            UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();
            self.imageView.image = image;
            [self.coverView removeFromSuperview];
        }
    }
    
    效果图: 伸缩裁剪.gif

    擦除图片

    实现关键方法
    CGContextClearRect(ctx, rect);

    - (void)pan:(UIPanGestureRecognizer *)sender {
        if(sender.state == UIGestureRecognizerStateChanged){
            //获取擦除的方框的rect
            CGFloat rectWH = 30;
            CGPoint curPoint = [sender locationInView:self.imageView];
            CGFloat curX = curPoint.x - 15;
            CGFloat curY = curPoint.y - 15;
            CGRect rect = CGRectMake(curX, curY, rectWH, rectWH);
            //绘制图片
            UIGraphicsBeginImageContextWithOptions(self.imageView.frame.size, NO, 0);
            CGContextRef ctx = UIGraphicsGetCurrentContext();
            //把imageView渲染到上下文中
            [self.imageView.layer renderInContext:ctx];
            CGContextClearRect(ctx, rect);
            UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();
            self.imageView.image = newImage;
        }
    }
    
    效果图: 擦除图片.png

    相关文章

      网友评论

          本文标题:iOS UIBezierPath裁剪图片

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