2009-07-11 55 views
21

我想從當前的圖形上下文創建一個UIImage對象。更具體地說,我的用例是用戶可以繪製線條的視圖。他們可能會逐漸繪製。完成後,我想創建一個UIImage來表示他們的繪圖。如何從當前圖形上下文創建UIImage?

這裏是什麼的drawRect:看起來像我現在:

- (void)drawRect:(CGRect)rect 
{ 
CGContextRef c = UIGraphicsGetCurrentContext(); 

CGContextSaveGState(c); 
CGContextSetStrokeColorWithColor(c, [UIColor blackColor].CGColor); 
CGContextSetLineWidth(c,1.5f); 

for(CFIndex i = 0; i < CFArrayGetCount(_pathArray); i++) 
{ 
    CGPathRef path = CFArrayGetValueAtIndex(_pathArray, i); 
    CGContextAddPath(c, path); 
} 

CGContextStrokePath(c); 

CGContextRestoreGState(c); 
} 

...其中_pathArray的類型是CFArrayRef的,並填充每touchesEnded時間:被調用。另請注意,drawRect:可能會在用戶繪製時被調用多次。

當用戶完成後,我想創建一個代表圖形上下文的UIImage對象。有關如何做到這一點的任何建議?

+0

雙雙跌破工作的答案。請注意,兩者之間存在功能差異,即在圖像上下文中渲染圖層也會渲染圖層的背景;調用drawRect:直接不(在我的情況下沒關係)。我正在使用CALayer的renderInContext方法,因爲直接調用drawRect非常複雜(詳情請參閱http://lists.apple.com/archives/Cocoa-dev/2002/Apr/msg01846.html)。謝謝! – figelwump 2009-07-11 17:41:45

回答

42

您需要安裝圖形上下文第一:

UIGraphicsBeginImageContext(myView.bounds.size); 
[myView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
7

UIImage * image = UIGraphicsGetImageFromCurrentImageContext();

如果你需要保持image左右,一定要保留它!

編輯:如果要將drawRect的輸出保存到圖像,只需使用UIGraphicsBeginImageContext創建一個位圖上下文,並使用新的上下文綁定調用drawRect函數。這比在drawRect中保存CGContextRef要容易 - 因爲該上下文可能沒有與之關聯的位圖信息。

UIGraphicsBeginImageContext(view.bounds.size); 
[view drawRect: [myView bounds]]; 
UIImage * image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

您也可以使用Kelvin提到的方法。如果你想從像UIWebView這樣更復雜的視圖創建圖像,他的方法更快。繪製視圖的圖層不需要刷新圖層,只需要將圖像數據從一個緩衝區移動到另一個緩衝區!

+0

感謝您的迴應,但似乎沒有工作。我添加了這一行: \t _signatureImage = UIGraphicsGetImageFromCurrentImageContext(); ...其中_signatureImage是保留屬性。返回的對象是零。根據文檔,UIGraphicsGetImageFromCurrentImageContext()僅適用於當前上下文是位圖上下文的情況。在我目前的drawRect實現中:我不相信是這樣。該文檔提到使用UIGraphicsBeginImageContext(),但我不知道這是如何適用於我的情況,因爲drawRect可能會被調用多次。 – figelwump 2009-07-11 05:43:10

2

斯威夫特版本

func createImage(from view: UIView) -> UIImage { 
     UIGraphicsBeginImageContext(view.bounds.size) 
     view.layer.renderInContext(UIGraphicsGetCurrentContext()!) 
     let viewImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 

     return viewImage 
    }