Extract a part of UIImageView

前端 未结 2 754
时光说笑
时光说笑 2020-12-20 07:40

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 a

相关标签:
2条回答
  • 2020-12-20 08:07

    Yes, it's possibile.First you should get the UIImageView's image, using this property:

    @property(nonatomic, retain) UIImage *image;
    

    And NSImage's :

    @property(nonatomic, readonly) CGImageRef CGImage;
    

    Then you get the cut image:

    CGImageRef cutImage = CGImageCreateWithImageInRect(yourCGImageRef, CGRectMake(x, y, w, h));
    

    If you want again a UIImage you should use this UIImage's method:

    + (UIImage *)imageWithCGImage:(CGImageRef)cgImage;
    

    PS: I don't know how to do it directly, without convert it to CGImageRef, maybe there's a way.

    0 讨论(0)
  • 2020-12-20 08:12

    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:...]

    0 讨论(0)
提交回复
热议问题