2010-10-12 13 views
8

Próbuję przyciąć region z UIView, do UIImage do późniejszego wykorzystania.UIImage z regionu UIView

mam wypracowane ten kod z niektórych fragmentów:

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' jest UIView który mam wycinek i _finalImage jest UIImage chcę.

Kod działa bez problemu, jednak jest trochę powolny. Wierzę, że niektóre wydajności można uzyskać, biorąc tylko część ekranu bezpośrednio w kroku A.

Szukam czegoś takiego jak renderInContext: withRect: lub UIGraphicsGetImageFromCurrentImageContextWithRect() hehe.

Nadal nie znalazłem nic jeszcze :(, proszę mi pomóc, jeśli wiesz o jakiejś alternatywie

+0

Czy możesz przeformatować? trudne do odczytania – Rudiger

Odpowiedz

6

Metoda zaciski regionem widzenia mniej pamięci i czas procesora:

-(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

Można spróbować rasteryzacji UIView pierwszy.

view.layer.shouldRasterize = YES; 

mam ograniczony sukces, ale za pomocą tego mówi, że robię to samo, co ty (plus powyższa linia) i działa dobrze. W jakim kontekście robisz to w? Może to być twój problem z wydajnością

EDYCJA: Możesz także spróbować użyć granice widoku zamiast ramy widoku nie zawsze są takie same.

+0

"Główny" kontekst, który myślę. Tworzę nowy kontekst na głównym wątku. : S – almosnow

0

Swift wersja @ phix23 rozwiązania. dodawanie skali

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 
}