我有一个NSView,其中包含一个NSScrollView,其中包含一个支持CALayer的NSView。我已经尝试了将NSView捕获到NSImage中的所有常用方法(使用-dataWithPDFInsideRect
,NSBitmapImageRep的-initWithFocusedViewRect
等)。但是,所有这些方法都将CALayer支持的NSView视为不是存在。我已经看过this StackOverflow帖子,但这是一个关于将CALayer树渲染到图像的问题,而不是包含常规NSView和图层支持视图的NSView。
感谢任何帮助,谢谢:)
答案 0 :(得分:6)
我发现这样做的唯一方法是使用CGWindow API,例如:
CGImageRef cgimg = CGWindowListCreateImage(CGRectZero, kCGWindowListOptionIncludingWindow, [theWindow windowNumber], kCGWindowImageDefault);
然后使用
剪切出与您的视图对应的CGImage部分 -imageByCroppingToRect
。
然后从裁剪的CGImage中制作NSImage。 请注意,如果该窗口的某些部分位于屏幕外,则无法正常工作。
答案 1 :(得分:2)
这可以直接将视图绘制到NSImage
,但我没有尝试使用图层支持的视图:
NSImage * i = [[NSImage alloc] initWithSize:[view frame].size];
[i lockFocus];
if ([view lockFocusIfCanDrawInContext:[NSGraphicsContext currentContext]]) {
[view displayRectIgnoringOpacity:[view frame] inContext:[NSGraphicsContext currentContext]];
[view unlockFocus];
}
[i unlockFocus];
NSData * d = [i TIFFRepresentation];
[d writeToFile:@"/path/to/my/test.tiff" atomically:YES];
[i release];
答案 2 :(得分:0)
您是否看过“可可绘图指南”中的建议? ("Creating a Bitmap")
要直接绘制位图,请使用所需参数创建新的NSBitmapImageRep对象,并使用NSGraphicsContext的graphicsContextWithBitmapImageRep:方法创建绘图上下文。使新上下文成为当前上下文并绘制。此技术仅适用于Mac OS X v10.4及更高版本。 或者,您可以创建NSImage对象(或屏幕外窗口),绘制到其中,然后捕获图像内容。所有版本的Mac OS X都支持此技术。
这听起来类似于我熟悉的iOS解决方案(使用UIGraphicsBeginImageContext和UIGraphicsGetImageFromCurrentImageContext),所以我希望它适用于您的视图。
答案 3 :(得分:0)
请看一下这篇文章的答案:How do I render a view which contains Core Animation layers to a bitmap?
在类似情况下,这种方法对我有用。