我正在为CGMapOverlayView创建的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上的答案。
答案 0 :(得分:1)
您可以使用CGLayerRef。图层引用类似于子上下文,您可以在绘制图层的内容时完成一系列绘图,然后展平到原始上下文中。
它通常用于在多个绘图调用中获取共享的alpha或阴影,而不是每个单独的调用。
我不知道这是否仍会解决您遇到的任何错误,或者性能是否比两种上下文方法更好或更差。我需要更多地了解您的目标和要求。例如,您是否要避免使用两个上下文来避免第二个副本,或者因为您不想为第二个图像支付内存?
答案 1 :(得分:0)
仅当使用CGBitmapContextCreateImage修改位图图形上下文中的基础数据时,才发生位的实际物理副本,因此没有太多 从CGBitmapContext创建图像时,性能会下降。