Extract a part of UIImageView

2019-01-27 04:19发布

问题:

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:

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

回答1:

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



回答2:

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.