Как отобразить представление, содержащее слои Core Animation, в растровое изображение?
Я используюNSView
провести несколько основных анимацииCALayer
объекты. То, что я хочу сделать, это сделать снимок видатекущее состояние как растровое изображение.
Это относительно просто с нормальнымNSView
используя что-то вроде этого:
void ClearBitmapImageRep(NSBitmapImageRep* bitmap) {
unsigned char* bitmapData = [bitmap bitmapData];
if (bitmapData != NULL)
bzero(bitmapData, [bitmap bytesPerRow] * [bitmap pixelsHigh]);
}
@implementation NSView (Additions)
- (NSBitmapImageRep*)bitmapImageRepInRect:(NSRect)rect
{
NSBitmapImageRep* imageRep = [self bitmapImageRepForCachingDisplayInRect:rect];
ClearBitmapImageRep(imageRep);
[self cacheDisplayInRect:rect toBitmapImageRep:imageRep];
return imageRep;
}
@end
Однако, когда я использую этот код, слои Core Animation не отображаются.
Я исследовалCARenderer
, поскольку он, кажется, делает то, что мне нужно, однако я не могу заставить его отобразить существующее дерево слоев. Я попробовал следующее:
NSOpenGLPixelFormatAttribute att[] =
{
NSOpenGLPFAWindow,
NSOpenGLPFADoubleBuffer,
NSOpenGLPFAColorSize, 24,
NSOpenGLPFAAlphaSize, 8,
NSOpenGLPFADepthSize, 24,
NSOpenGLPFANoRecovery,
NSOpenGLPFAAccelerated,
0
};
NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes:att];
NSOpenGLView* openGLView = [[NSOpenGLView alloc] initWithFrame:[self frame] pixelFormat:pixelFormat];
NSOpenGLContext* oglctx = [openGLView openGLContext];
CARenderer* renderer = [CARenderer rendererWithCGLContext:[oglctx CGLContextObj] options:nil];
renderer.layer = myContentLayer;
[renderer render];
NSBitmapImageRep* bitmap = [oglView bitmapImageRepInRect:[oglView bounds]];
Однако, когда я делаю это, я получаю исключение: я
CAContextInvalidLayer -- layer is already attached to a context
Я предполагаю, что это должно быть потому, что дерево слоев находится в моемNSView
и поэтому привязан к своему контексту. Я нене понимаю, как я могу отделить дерево слоев отNSView
для того, чтобы отобразить его в растровое изображение, и этоНетривиально в этом случае создать дубликат дерева слоев.
Есть ли другой способ получитьCALayer
s для рендеринга в растровое изображение? Я могу'я не могу найти ни одного примера кода для этого, на самом деле я не могунайти любой пример кода дляCARenderer
совсем.