UIImage из региона UIView - PullRequest
       2

UIImage из региона UIView

8 голосов
/ 13 октября 2010

Я пытаюсь обрезать область UIView в UIImage для последующего повторного использования.

Я разработал этот код из некоторых фрагментов:

 CGRect _frameIWant = CGRectMake(100, 100, 100, 100);

 UIGraphicsBeginImageContext(view.frame.size);
 [view.layer renderInContext:UIGraphicsGetCurrentContext()];

 //STEP A: GET AN IMAGE FOR THE FULL FRAME
 UIImage *_fullFrame = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();

 //STEP B: CLIP THE IMAGE
 CGImageRef _regionImage = CGImageCreateWithImageInRect([_fullFrame CGImage], _frameIWant);
 UIImage *_finalImage = [UIImage imageWithCGImage:_regionImage];
 CGImageRelease(_regionImage);

'view' - это UIView, который я обрезаю, а _finalImage - это UIImage, который я хочу.

Код работает без проблем, но довольно медленно. Я полагаю, что некоторую производительность можно было бы получить, взяв лишь часть экрана непосредственно на шаге А.

Я ищу что-то вроде renderInContext: withRect: или UIGraphicsGetImageFromCurrentImageContextWithRect() хе-хе.

Все еще ничего не нашел :(, пожалуйста, помогите мне, если вы знаете какую-то альтернативу.

Ответы [ 3 ]

6 голосов
/ 21 марта 2013

Этот метод обрезает область представления, используя меньше памяти и процессорного времени:

-(UIImage*)clippedImageForRect:(CGRect)clipRect inView:(UIView*)view
{
    UIGraphicsBeginImageContextWithOptions(clipRect.size, YES, 1.f);
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(ctx, -clipRect.origin.x, -clipRect.origin.y);
    [view.layer renderInContext:ctx];
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return img;
}
0 голосов
/ 14 декабря 2015

Swift версия решения @ phix23.добавление шкалы

func clippedImageForRect(clipRect: CGRect, inView view: UIView) -> UIImage {
    UIGraphicsBeginImageContextWithOptions(clipRect.size, true, UIScreen.mainScreen().scale);
    let ctx = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(ctx, -clipRect.origin.x, -clipRect.origin.y);
    view.layer.renderInContext(ctx!)
    let img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return img
}
0 голосов
/ 13 октября 2010

Вы можете сначала попробовать растеризацию UIView:

view.layer.shouldRasterize = YES;

У меня ограниченный успех в использовании этого, но я говорю, что я делаю то же самое, что и вы (плюс вышеприведенная строка), и он работает нормально. В каком контексте вы это делаете? Это может быть ваша проблема производительности.

РЕДАКТИРОВАТЬ: Также вы можете попробовать использовать границы вида вместо рамки вида. Они не всегда одинаковы.

...