2012-04-25 42 views
1

我使用下面的生成從一個UIView非空無效情況下的錯誤從一個UIView創建一個UIImage時

UIGraphicsBeginImageContextWithOptions(view.frame.size, YES, [[UIScreen mainScreen] scale]); 
[view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage* img = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

通常工作,但半年左右的時間,我得到這個錯誤時,一個UIImage renderInContext被稱爲:

<Error>: CGContextDrawImage: invalid context 0x84d0b20 

有沒有人有任何想法,爲什麼會發生這種情況,或者如何甚至檢測它何時發生?如果上下文的地址是0x0,我想我會感覺更好,因爲它至少是我可以測試和處理的東西,但是到目前爲止,這讓我難以置信。

編輯:哎呦。意思是使用view.frame.size而不是view.bounds.size。

+1

你有想過嗎?我也得到非空無效的上下文錯誤...我從UIGraphicsGetImageFromCurrentImageContext()出來的UIImage看起來不錯... – minovsky 2013-02-26 08:54:26

+0

不幸的是,沒有。我想我將不得不重新繪製我試圖用繪圖命令捕捉的東西。 – Vince 2013-02-26 20:56:21

+0

@minovsky我得到了與上下文相同的問題,但是我的情況有點不同。無論如何,在我的情況下,這是UIGraphicsPushContext/UIGraphicsPopContext平衡的問題。我彈出了超過推送,當我試圖對該上下文執行任何操作(即使它在使用之前被推入) - 出現無效的上下文錯誤。 – 2014-09-23 19:59:48

回答

4

我有一個類似的問題,但能夠通過推送和彈出圖像上下文之前我的圖層呈現其內容解決它。

嘗試這樣:

UIImage *snapshotImage = nil; 
UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, view.layer.contentsScale); 
{ 
    CGContextRef imageContext = UIGraphicsGetCurrentContext(); 

    if (imageContext != NULL) { 
     UIGraphicsPushContext(imageContext); 
     { 
      [view.layer renderInContext:imageContext]; 
     } 
     UIGraphicsPopContext(); 
    } 

    snapshotImage = UIGraphicsGetImageFromCurrentImageContext(); 
} 
UIGraphicsEndImageContext(); 

對於它的價值,也有替代(和更有效)的方式來獲得一個快照,但它仍然在保密協議。

+0

謝謝!我會接受這個答案,因爲你已經看到了這個問題並且有一個解決方法。我假設替代品是在iOS 7下?我在iOS 5下碰到了這個bug,但最終通過使用CoreGraphics手動繪製所有東西來解決它。 – Vince 2013-09-04 19:55:06

+0

是的。如果您有權訪問iOS7文檔,請查看添加到UIView的一些新方法:) – 2013-09-04 22:43:42

0
UIGraphicsBeginImageContext(self.view.frame.size); 
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

希望,這將幫助你....

+0

我已經試過,以及相同的結果。 – Vince 2012-04-25 19:57:32

+0

當你釋放當前的圖形上下文引用時會發生這種情況。如果你使上下文像'CGContextRef Context = UIGraphicsGetCurrentContext()'那樣,你不應該釋放'Context',並且如果你想釋放它而不是使用CGBitmapContextCreate來創建上下文,否則它總會給你':CGContextDrawImage:invalid context 0x84d0b20' – Nit 2012-04-26 03:17:20

+0

我沒有任何代碼可以從UIGraphicsEndImageContext中釋放上下文。你是說我應該使用CGBitmapContextCreate,而是在完成時明確地釋放它? – Vince 2012-04-27 03:39:55

5

如果創建寬度或高度爲零的情況下,上下文將是無效的。如果視圖尺寸爲0,則可能發生這種情況,如果視圖爲nil,則任一軸上的視圖尺寸爲

而且,由於你渲染層,你可能希望得到的範圍和規模,而不是視圖邊界屏幕比例。大多數情況下,這些數值都是相同的,但考慮到它們不適用的時間是很好的。

// Debugging output to see how if an invalid context is being created due to zero size. 
NSLog(@"View = %@", view); 
NSLog(@"View size = %@", NSStringFromCGSize(view.bounds.size)); 

UIGraphicsBeginImageContextWithOptions(view.layer.bounds.size, YES, view.layer.contentsScale); 
[view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage* img = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
+0

我會試一試。在我發佈的代碼中實際存在一個錯誤;我實際上使用view.frame.size而不是邊界。不過,我會嘗試一下圖層邊界。我知道視圖和維度是有效的,因爲我有打印出它們的值的代碼。另一件事是,這不會一直髮生。 – Vince 2012-04-25 19:59:21

+0

如果您將有效參數發送到'UIGraphicsBeginImageContextWithOptions',則問題可能在此代碼之外。有可能以損壞完成後才能看到的方式破壞圖形狀態。你有沒有看到[繪製UIImage時無效的上下文錯誤](http://stackoverflow.com/q/7642731/1318452),其中有人建議調用'CGContextSaveGState'可能導致它,並且問題變成了'反正不需要的CALayer'? – Dondragmer 2012-04-25 20:09:03

+0

另外,你是否在主線程中調用了它? [UIKit函數參考](http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIKitFunctionReference/Reference/reference.html)指定它不能在其他地方調用。 – Dondragmer 2012-04-25 20:14:27