iOS UIBezierPath裁剪图片

2018-08-08  本文已影响0人  Zonpai

裁剪加边框

- (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
上一篇 下一篇

猜你喜欢

热点阅读