views:

376

answers:

1

Hi,

I have an image in an UIScrollView, that can be scrolled and zoomed.

When the user presses a button, I want the code to create an image from whatever part of the UIScrollView is inside an area I specify with a CGRect.

I've seen code to crop UIImages, but I can't adapt it to do the same for a view, because it uses CGContextDrawImage.

Any thoughts?

Cheers, Andre

+3  A: 

I've managed to get it.

Here's my solution, based on a few different ones from the web:

- (UIImage *)imageByCropping:(UIScrollView *)imageToCrop toRect:(CGRect)rect
{
    CGSize pageSize = rect.size;
    UIGraphicsBeginImageContext(pageSize);

    CGContextRef resizedContext = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(resizedContext, -imageToCrop.contentOffset.x, -imageToCrop.contentOffset.y - 73);
    [scrollView.layer renderInContext:resizedContext];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return image;
}

which you call by using:

CGRect clippedRect = CGRectMake(0, 0, 320, 307);
picture.image = [self imageByCropping:myScrollView toRect:clippedRect];
Andre
That was helpful, thanks.A little bug in the method, though: it refers to scrollView, although it should refer to imageToCrop instead, in case the caller does not name the view "scrollView".
Thomas Tempelmann
You're totally right :) I'm glad you found it useful though.Cheers
Andre
This is very useful! Thank you Andre
Ganesh