【问题标题】:Copy CGContext into another CGContext将 CGContext 复制到另一个 CGContext
【发布时间】:2011-08-05 15:41:12
【问题描述】:

我正在为 MKMapOverlayView 创建的 CGContext 中执行一些 CG 绘图操作。绘制到我的上下文后,我创建了一个图像并将其粘贴到 MapKit 提供的上下文中。

- (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context {
    CGColorSpaceRef colorRef = CGColorSpaceCreateDeviceRGB();
    CGContextRef myContext = CGBitmapContextCreate(NULL, kTileSize, kTileSize, 8, 0, colorRef, kCGImageAlphaPremultipliedLast);
    CGColorSpaceRelease(colorRef);
    CGContextSetAllowsAntialiasing(myContext, TRUE);
    //...cut out drawing operations...
    CGImageRef image = CGBitmapContextCreateImage(myContext);
    CGContextDrawImage(context, [self rectForMapRect:mapRect], image);
    CGImageRelease(image);
    CGContextRelease(myContext);
}

有没有办法简单地将myContext 复制到context 而无需创建图像?

我意识到你们中的一些人会说“为什么不直接绘制到 MapKit 提供的上下文中”。不幸的是,我们在直接渲染到context 时遇到了绘图故障。 Apple 目前正在为我们调查此问题,但与此同时,我们需要找到解决方法。我在上面介绍的这种解决方法是我的“最佳”方法,但它有点慢。

P.S.我已经开始赏金了,因为我也在这里寻找答案。具体来说,我的目标是 OS X。所以答案应该在那里工作。 OP 正在 iOS 上寻找答案。

【问题讨论】:

  • 您找到解决问题的合适方法了吗?我现在面临同样的问题...
  • 不幸的是,没有...尽管CGFloat 在 64 位 iOS 设备上是 double,但在呈现非常小的更改时,较大的整数甚至更大的分数仍然会引入足够的抖动到地图图块。

标签: objective-c swift core-graphics cgcontext


【解决方案1】:

您可以使用 CGLayerRef。 layer ref 就像子上下文一样,您在其中进行大量绘制,然后在绘制完该层的内容时将其展平到原始上下文中。

它通常用于在许多绘图调用而不是每个单独调用中获取共享 alpha 或阴影。

我不知道这是否仍然可以解决您遇到的任何错误,或者性能是否比两个上下文方法更好或更差。我需要更多地了解您的目标和要求。例如,您是要避免使用两个上下文来避免第二个副本,还是因为您不想为第二个图像支付内存?

【讨论】:

    【解决方案2】:

    只有在使用 CGBitmapContextCreateImage 时修改了位图图形上下文中的底层数据时才会发生位的实际物理副本,因此没有太多 从 CGBitmapContext 创建图像时的性能损失。

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多