Search code examples
iphoneobjective-cuiimageviewresizewarp

Extract a part of UIImageView


I was wondering if it's possible to "extract" a part of UIImageView.

For example, I select using Warp Affine a part of the UIImageView and I know the selected part frame.

like in this image:

enter image description here

Is it possible to get from the original UIImageView only the selected part without losing quality?


Solution

  • Get the snapshot of the view via category method:

    @implementation UIView(Snapshot)
    
    -(UIImage*)makeSnapshot
    {
      CGRect wholeRect = self.bounds;
    
      UIGraphicsBeginImageContextWithOptions(wholeRect.size, YES, [UIScreen mainScreen].scale);
    
      CGContextRef ctx = UIGraphicsGetCurrentContext();
      [[UIColor blackColor] set];
      CGContextFillRect(ctx, wholeRect);
      [self.layer renderInContext:ctx];
    
      UIImage* image = UIGraphicsGetImageFromCurrentImageContext();
    
      UIGraphicsEndImageContext();
    
      return image;
    }
    
    @end
    

    then crop it to your rect via another category method:

    @implementation UIImage(Crop)
    
    -(UIImage*)cropFromRect:(CGRect)fromRect
    {
      fromRect = CGRectMake(fromRect.origin.x * self.scale,
                            fromRect.origin.y * self.scale,
                            fromRect.size.width * self.scale,
                            fromRect.size.height * self.scale);
      CGImageRef imageRef = CGImageCreateWithImageInRect(self.CGImage, fromRect);
      UIImage* crop = [UIImage imageWithCGImage:imageRef scale:self.scale orientation:self.imageOrientation];
      CGImageRelease(imageRef);
      return crop;
    }
    
    @end
    

    in your VC:

    UIImage* snapshot = [self.imageView makeSnapshot];
    UIImage* imageYouNeed = [snapshot cropFromRect:selectedRect];
    

    selectedRect should be in you self.imageView coordinate system, if no so then use selectedRect = [self.imageView convertRect:selectedRect fromView:...]