将CGContext复制到另一个CGContext中

Tim*_*ddy 10 core-graphics objective-c cgcontext swift

我正在为我为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);
}
Run Code Online (Sandbox Code Playgroud)

有没有办法简单地复制myContextcontext无需创建图像?

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

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

Jon*_*ess 1

您可以使用 CGLayerRef。图层引用就像子上下文,您可以在其中进行大量绘制,然后在绘制完图层的内容后,将其平铺到原始上下文中。

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

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