2010-10-12 98 views
8

我試圖將UIView的區域剪切爲UIImage以備後用。來自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); 

「視圖」是我削波和_finalImageUIImage我想要的UIView

該代碼工作沒有問題,但是有點慢。我相信通過直接在步驟A中取得部分屏幕可以獲得一些性能。

我正在尋找類似renderInContext: withRect:UIGraphicsGetImageFromCurrentImageContextWithRect()的東西呵呵。

仍然沒有發現任何東西:(,請幫助我,如果你知道一些替代的

+0

你能重新格式化嗎?難以閱讀 – Rudiger 2010-10-12 20:49:34

回答

6

此方法剪輯使用較少的存儲器和CPU時間的視圖的區域:

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

你可以嘗試先柵格化的UIView:

view.layer.shouldRasterize = YES; 

我一直在使用這個有限的成功,但是說我正在做和你一樣的東西(加上上面的一行),並且它工作正常。在什麼情況下你做這件事?這可能是你的性能問題。

編輯:你也可以嘗試使用視圖的界限而不是視圖的框架並不總是相同的。

+0

我認爲這是'主要'的背景。我在主線上創建了一個新的上下文。 :S – almosnow 2010-11-16 22:15:12

0

的@夫特版本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 
}