图片截取

图片截屏实现思路.
手指在屏幕上移动的时
添加一个半透明的UIView,
然后开启一个上下文把UIView的frame设置成裁剪区域.把图片显示的图片绘制到上下文当中,生成一张新的图片
再把生成的图片再赋值给原来的UImageView.

具体实现步骤:

  • 1.给图片添加一个手势,监听手指在图片上的拖动,添加手势时要注意,UIImageView默认是不接事件的.
    要把它设置成能够接收事件
  • 2.监听手指的移动.手指移动的时候添加一个UIView,
    x,y就是起始点,也就是当前手指开始的点.
    width即是x轴的偏移量,
    高度即是Y轴的偏移量.
    UIView的尺寸位置为CGrect(x,y,witdth,height);
      计算代码为:
      CGFloat offSetX = curP.x - self.beginP.x;
      CGFloat offsetY = curP.y - self.beginP.y;
      CGRect rect = CGRectMake(self.beginP.x, self.beginP.y, offSetX, offsetY);

UIView之需要添加一次,所以给UIView设置成懒加载的形式,
保证之有一个.每次移动的时候,只是修改UIView的frame.

  • 3.开启一个图片上下文,图片上下文的大小为原始图片的尺寸大小.使得整个屏幕都能够截屏.
    利用UIBezierPath设置一个矩形的裁剪区域.
    然后把这个路径设置为裁剪区域.
    把路径设为裁剪区域的方法为:
    [path addClip];

  • 4.把图片绘制到图片上下文当中
    由于是一个UIImageView上面的图片,所以也得需要渲染到上下文当中.
    要先获取当前的上下文,
    把UIImageView的layer渲染到当前的上下文当中.
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    [self.imageV.layer renderInContext:ctx];

  • 5.取出新的图片,重新赋值图片.
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    self.imageV.image = newImage;

  • 6.关闭上下文,移除上面半透明的UIView
    UIGraphicsEndImageContext();
    [self.coverView removeFromSuperview];


/**
 *  懒加载coverV
 *  1.能够保证超始至终只有一份
 *  2.什么时候用到什么时候才去加载
 */
-(UIView *)coverV {
    
    if (_coverV == nil) {
        
        //添加一个UIView
        UIView *coverV = [[UIView alloc] init];
        coverV.backgroundColor = [UIColor blackColor];
        coverV.alpha = 0.7;
        _coverV = coverV;
        [self.view addSubview:coverV];
    }
    return _coverV;
}


- (IBAction)pan:(UIPanGestureRecognizer *)pan {
    
    //判断手势的状态
    CGPoint curP = [pan locationInView:self.imageV];
    if(pan.state == UIGestureRecognizerStateBegan) {
        self.startP = curP;
    } else if(pan.state == UIGestureRecognizerStateChanged) {
        
        CGFloat x = self.startP.x;
        CGFloat y = self.startP.y;
        CGFloat w = curP.x - self.startP.x;
        CGFloat h = curP.y - self.startP.y;
        CGRect rect =  CGRectMake(x, y, w, h);
        
        //添加一个UIView
        self.coverV.frame = rect;
        
    } else if (pan.state == UIGestureRecognizerStateEnded) {
        
      
        //把超过coverV的frame以外的内容裁剪掉
        //生成了一张图片,把原来的图片给替换掉.
        UIGraphicsBeginImageContextWithOptions(self.imageV.bounds.size, NO, 0);
        
        //把ImageV绘制到上下文之前,设置一个裁剪区域
        UIBezierPath *clipPath = [UIBezierPath bezierPathWithRect:self.coverV.frame];
        [clipPath addClip];
        
        
     
        //把当前的ImageView渲染到上下文当中
        CGContextRef ctx =  UIGraphicsGetCurrentContext();
        [self.imageV.layer renderInContext:ctx];
        //.从上下文当中生成 一张图片
        UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
        //关闭上下文
        UIGraphicsEndImageContext();
        
      
       
        
        self.imageV.image = newImage;
        

        
    }

你可能感兴趣的:(图片截取)