2013-12-16 71 views
1

我的代码存在问题,因为我不清楚使用UIBezierPath裁剪图像。我绘制了一个形状视图,用于在一个imageview上裁剪。 MyViewController有2个图像浏览和一个squareview。 有原始图像视图和裁剪图像视图(裁剪时的结果)。我想将我的squareview移动到任何位置,以裁剪原始图像视图以使用我的形状显示在裁剪后的图像视图中。如何使用UIBezierPath裁剪图像与另一个形状

enter image description here

后,我将我的方形像图像below.Then的originalImageView我挖掘作物。

enter image description here

但在croppedImageView结果显示错误的图像是这样的。

enter image description here

我会详细介绍我的代码:

在SquareView.m

#import "SquareView.h" 
    #import <QuartzCore/QuartzCore.h> 
    @interface SquareView() 
    { 
     UIBezierPath *aPath; 
     UILabel *textLabel; 
    } 

    @end 
    @implementation SquareView 

    - (id)initWithFrame:(CGRect)frame 
    { 
     self = [super initWithFrame:frame]; 
     if (self) { 
       self.backgroundColor = [UIColor clearColor]; 
       self.opaque = NO; 
       CGRect labelRect = CGRectMake(self.frame.size.width/2 - 30, self.frame.size.height/2 - 10, 150, 20); 
       textLabel = [[UILabel alloc] initWithFrame:labelRect]; 
       [textLabel setBackgroundColor:[UIColor clearColor]]; 
     } 
     return self; 
    } 


    -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
    { 
     UITouch *aTouch = [touches anyObject]; 
     CGPoint location = [aTouch locationInView:self]; 
     CGPoint previousLocation = [aTouch previousLocationInView:self]; 
     self.frame = CGRectOffset(self.frame, location.x-previousLocation.x, location.y- previousLocation.y); 
     [textLabel setText:@"Click To Crop"]; 
     [textLabel setTextColor:[UIColor greenColor]]; 
     [self addSubview:textLabel]; 
    } 

    -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
    { 
     [textLabel removeFromSuperview]; 
    } 


    - (void)drawRect:(CGRect)rect 
    { 
     aPath = [UIBezierPath bezierPath]; 
     // Start Point and Draw the lines. 
     [aPath moveToPoint:CGPointMake(0,0)]; 
     [aPath addLineToPoint:CGPointMake(300,0)]; 
     [aPath addLineToPoint:CGPointMake(300, 300)]; 
     [aPath addLineToPoint:CGPointMake(0, 300)]; 
     [aPath closePath]; 

     //Fill Color and Line Color 
     UIColor *colorBg = [UIColor clearColor]; 
     UIColor *lineColor = [UIColor redColor]; 
     [aPath setLineWidth:5]; 
     [lineColor setStroke]; 
     [aPath stroke]; 
     [colorBg setFill]; 
     [aPath fill]; 

    } 
    @end 

在MyViewController.m

 -(void)initSquareView 
    { 
      sqaure = [[SquareView alloc] initWithFrame:CGRectMake(100, 200, 300, 300)]; 

      tapeGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(cropImage:)]; 
      tapeGesture.numberOfTapsRequired = 1; 

      [sqaure addGestureRecognizer:tapeGesture]; 
      [sqaure addGestureRecognizer:pinchGesture]; 
      [self.view addSubview:sqaure]; 
    } 

    -(void)cropImage:(UITapGestureRecognizer *)gesture 
    { 

      [sqaure removeFromSuperview]; 

      UIGraphicsBeginImageContextWithOptions(self.view.frame.size, NO, 0.0); 
      CGContextRef context_ = UIGraphicsGetCurrentContext(); 

      //(if iOS 7), (else iOS 6) 
      if ([self respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)]) 
       [self.view drawViewHierarchyInRect:self.view.bounds afterScreenUpdates:NO]; 
      else 
       [self.view.layer renderInContext:context_]; 
      UIImage *captureImage = UIGraphicsGetImageFromCurrentImageContext(); 
      UIGraphicsEndImageContext(); 

      CGRect imageRect = CGRectMake(0, 0, sqaure.frame.size.width, sqaure.frame.size.height); 
      UIGraphicsBeginImageContextWithOptions(sqaure.bounds.size, NO, 0.0f); 
      //Capture as square shape 
      //My problem is here 
      UIBezierPath *sqaurepath = [UIBezierPath bezierPath]; 
      [sqaurepath moveToPoint:CGPointMake(0,0)]; 
      [sqaurepath addLineToPoint:CGPointMake(300,0)]; 
      [sqaurepath addLineToPoint:CGPointMake(300, 300)]; 
      [sqaurepath addLineToPoint:CGPointMake(0, 300)]; 
      [sqaurepath closePath]; 
      [sqaurepath addClip]; 

      [captureImage drawInRect:imageRect]; 
      UIImage *croppedImage = UIGraphicsGetImageFromCurrentImageContext(); 
      UIGraphicsEndImageContext(); 

      [self.captureImageView setContentMode:UIViewContentModeScaleAspectFit]; 
      [self.captureImageView setImage:croppedImage]; 
      [self.captureImageView setUserInteractionEnabled:YES]; 
      [[self.captureImageView layer] setBorderColor:[UIColor redColor].CGColor]; 
      [[self.captureImageView layer] setBorderWidth:3];; 

    } 
    @end 

请帮我解决这个问题。

+0

你为什么要绘制整个视图进入情境?你应该计算一个矩形,并从图像中将矩形绘制到上下文中。 – Wain

+0

你的意思是? – Sovannarith

+0

'self.view drawViewHierarchyInRect'和'self.view.layer renderInContext'。这吸引了整个观点。你只是想要图像的一部分... – Wain

回答

0

您的captureImage是从整个视图的上下文中获取的。然后将其绘制到另一个较小尺寸的上下文中,该尺寸等于squareView的大小,然后获取名为croppedImage的相同图像。这正是你在上一张截图上的图片,这就是你的错误所在。

我居然没有使用bezierPath裁剪工作,但如果你只需要长方形croppings可以使用多simplier方式做到这一点:Cropping an UIImage