2010-10-12 13 views
8

UIView'un bir bölgesini daha sonra yeniden kullanmak üzere UIImage'a kopyalamaya çalışıyorum.UIView bir bölgesinden UIImage

Bazı parçacıkları bu kodu dışarı çalıştık:

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

'görünümü' ı kırpma ediyorum ve _finalImage istediğim UIImage olduğunu UIView olduğunu.

Kod sorunsuz çalışıyor, ancak biraz yavaş. Ekranın sadece bir kısmını doğrudan A Adımında alarak bazı performansın kazanılabileceğine inanıyorum.

renderInContext: withRect: veya UIGraphicsGetImageFromCurrentImageContextWithRect() hehe gibi bir şey arıyorum.

Hala bazı alternatif biliyorsanız, lütfen bana yardım

+0

Yeniden biçimlendirebilir misiniz? Okumak zor – Rudiger

cevap

6

Bu yöntem, görüntüleri, daha az bellek ve işlemci zaman kullanarak bir görüş bölge: çözelti phix23 @ arasında

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

Önce UIView rasterizing deneyebilirsiniz :(henüz bir şey bulamadım. Ben bu kullanarak başarıya sınırlı

view.layer.shouldRasterize = YES; 

ama Ben seninle aynı şeyi yapıyorum (artı yukarıdaki satır) ve iyi çalışıyor. Hangi bağlamda bunu yapıyorsun? Bu senin performans sorunu olabilir mi?

DÜZENLEME: Ayrıca kullanarak deneyebilirsiniz Görüşün çerçevesi yerine görünümün sınırları. her zaman aynı değildir.

+0

Bence 'ana' bağlam. Ana iş parçacığı üzerinde yeni bir bağlam oluşturuyorum. : S – almosnow

0

Swift sürümü. ekleme ölçeğini ekleme

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 
}