绘制 UIImage 时出现无效的上下文错误

Posted

技术标签:

【中文标题】绘制 UIImage 时出现无效的上下文错误【英文标题】:invalid context error when drawing a UIImage 【发布时间】:2011-10-04 02:31:58 【问题描述】:

我正在尝试将 UIImage 绘制到我的 UIView 的上下文中。我已经将这段代码与上下文内容一起使用了注释进出...

- (void)drawRect:(CGRect)rect

    //UIGraphicsBeginImageContextWithOptions(rect.size,YES,[[UIScreen mainScreen] scale]);
    //UIGraphicsBeginImageContext(rect.size);

    UIImage *newImage = [UIImage imageNamed:@"character_1_0001.png"];
    //[newImage drawAtPoint:CGPointMake(200, 200)];
    [newImage drawInRect:rect];

    //UIGraphicsEndImageContext();

据我了解,我不需要设置图像上下文来执行此操作,实际上如果没有它,我确实会看到在视图中绘制的图像,但我也在日志中收到此错误...

<Error>: CGContextSaveGState: invalid context 0x0

如果我取消注释 UIGraphicsBeginImageContext 行,我不会绘制任何内容,也不会出现错误。

我是否需要使用默认的图形上下文并以某种方式声明它?

我需要绘制图像,因为我想在上下文中添加图像并且不能只生成 UIImageView 对象的负载。

【问题讨论】:

您必须在其他地方有一些其他代码正在调用 CGContextSaveGState?你是说只有UIImage=drawInRect 行,你会得到这个错误? 如果我取消注释该代码中的上下文行,我不会收到错误消息,但在我的视图中看不到任何内容。因为它是我看到我的图像被绘制但得到上下文错误。很奇怪。 而且你自己不在其他任何地方调用 CGContextSaveGState 吗? 不。我现在正在测试这个。将尝试仅绘制一些文本。 另外,你不会直接打电话给drawRect,是吗?如果是这样,您在绘图时可能没有有效的上下文,这可能会给您带来错误。 【参考方案1】:

听起来你是直接打电话给drawRect:。因此,它会从您的电话中调用一次,然后从真正的绘图循环中调用一次。

创建上下文后,您可以在新上下文中进行所有绘图然后丢弃它,因此您什么也看不到 由于缺少上下文创建,您会从手动调用的drawRect: 中收到错误,并且实际绘图发生在真正的drawRect: 中,因此您可以看到您的图像。

不要直接拨打drawRect:。致电setNeedsDisplaydrawRect: 将在适当的时候为您呼叫。

【讨论】:

谢谢。我不是直接调用drawRect,但我会谈谈上下文。感谢您的反馈。 惭愧,我对自己的回答感到非常满意!很高兴你成功了。【参考方案2】:

我发现了正在发生的事情。我的自定义 UIView 的 ViewController 主机正在实例化一个 CALayer 对象。这是一些旧代码,以前被用作我用来生成图像的 AVCaptureSession 中的位图的绘图层。

我现在不使用 CALayer,而只是将每一帧视频的一部分绘制到我视图中的默认图形上下文中。

由于某种原因,此 CALayer 的实例化导致了上下文中的冲突。

现在不用了,我只需要用下面的代码来画图……

- (void)drawRect:(CGRect)rect

    UIImage *newImage = [UIImage imageNamed:@"character_1_0001.png"];
    [newImage drawInRect:rect];

现在我只是对作为 CGImageRef 传入的图像做同样的事情并调整矩形......希望如此。

【讨论】:

以上是关于绘制 UIImage 时出现无效的上下文错误的主要内容,如果未能解决你的问题,请参考以下文章

将屏幕外 CGLayer 传送到当前上下文时出现锯齿状路径

在UIImage周围添加透明空间

<错误>:CGContextSaveGState:无效上下文 0x0 错误

尝试从数组中删除元素时出现此错误:上下文类型“Int”不能与数组文字一起使用

在 Firefox 中的画布上下文对象上使用 svg 调用 drawImage() 时出现问题

将 spring-cloud-sleuth 添加到类路径时出现“上下文初始化”错误