将CGContext复制到另一个CGContext中

10

我正在为一个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时,我们遇到了绘制故障。苹果公司正在为我们调查此问题,但与此同时,我们需要找到一个解决方法。我上面提出的这种解决方法是我的“最佳”方法,但速度有点慢。
P.S. 我已经开始发起奖励了,因为我也在寻找答案。具体来说,我针对的是OS X。因此答案应该在那里有效。OP正在寻找iOS上的答案。

你找到这个问题的合适解决方法了吗?我现在也遇到了同样的问题。 - Georg
很遗憾,尽管在64位iOS设备上,CGFloat是一个double,但是当渲染地图瓦片的非常小的变化时,大整数和更大的分数仍会引入足够的抖动。 - Tim Reddy
2个回答

1
您可以使用CGLayerRef。图层引用类似于子上下文,您可以在其中进行大量绘图,然后在完成绘制图层的内容后将其平铺到原始上下文中。
它通常用于在许多绘图调用之间获取共享的alpha或阴影,而不是每个单独的调用。
我不知道这是否仍然可以解决您遇到的任何错误,或者性能是比两个上下文方法更好还是更差。我需要了解更多关于您的目标和要求的信息。例如,您是想避免使用两个上下文来避免第二次复制,还是因为您不想支付第二个图像的内存费用?

0

只有在使用CGBitmapContextCreateImage时,如果位图图形上下文中的底层数据被修改,才会出现实际的物理位拷贝,因此从CGBitmapContext创建图像时不会有太多性能损失。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接