Question

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?

Was it helpful?

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

OTHER TIPS

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top