2010-10-12 17 views
8

Sto provando a ritagliare una regione di un UIView, in un UIImage per il successivo riutilizzo.UIImmagine da una regione di UIView

ho lavorato fuori questo codice da alcuni frammenti:

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); 

'vista' è il UIView quale sto ritaglio e _finalImage è il UIImage che voglio.

Il codice funziona senza problemi, tuttavia è un po 'lento. Credo che alcune prestazioni potrebbero essere acquisite prendendo solo la porzione dello schermo direttamente nel passaggio A.

Sto cercando qualcosa come renderInContext: withRect: o UIGraphicsGetImageFromCurrentImageContextWithRect() hehe.

Ancora non hanno ancora trovato nulla :(, si prega di aiutare me, se siete a conoscenza di qualche alternativa

+0

potresti riformattarlo? difficile da leggere – Rudiger

risposta

6

Questo metodo clip una regione di vista utilizzando meno memoria e CPU tempo:

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

Si potrebbe provare la rasterizzazione del UIView prima:.

view.layer.shouldRasterize = YES; 

Ho limitato successo con questo, ma sta dicendo che sto facendo la stessa cosa di te (più la riga sopra) e funziona bene In quale contesto stai facendo questo? Potrebbe essere il tuo problema di prestazioni

EDIT: Anche tu potresti provare ad usare i limiti della vista invece della cornice della vista non sono sempre gli stessi

+0

Il contesto "principale" penso. Creo un nuovo contesto sul thread principale. :S – almosnow

0

versione Swift @ phix23 soluzione. aggiunta scala

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 
}