3

我正在使用以下内容从 UIView 生成 UIImage

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

这通常有效,但大约有一半的时间,当调用 renderInContext 时出现此错误:

<Error>: CGContextDrawImage: invalid context 0x84d0b20

有谁知道为什么会发生这种情况,或者如何检测它何时发生?我想如果上下文的地址是 0x0 我会感觉更好,因为它至少是我可以测试和处理的东西,但到目前为止这让我很难过。

编辑:哎呀。意味着使用 view.frame.size 而不是 view.bounds.size。

4

3 回答 3

6

如果创建宽度或高度为零的上下文,则上下文将无效。如果视图大小在任一轴上为零,或者视图为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();
于 2012-04-25T05:17:49.683 回答
5

我有一个类似的问题,但能够通过在我的图层渲染其内容之前推送和弹出图像上下文来解决它。

尝试这样的事情:

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

对于它的价值,有其他(更有效)的方法来获取快照,但它仍处于 NDA 之下。

于 2013-09-04T02:22:02.693 回答
0
UIGraphicsBeginImageContext(self.view.frame.size);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

希望对你有帮助....

于 2012-04-25T04:38:32.510 回答