将包含一些CALayers的NSView渲染到NSImage

时间:2010-12-23 05:45:19

标签: objective-c cocoa calayer nsview nsimage

我有一个NSView,其中包含一个NSScrollView,其中包含一个支持CALayer的NSView。我已经尝试了将NSView捕获到NSImage中的所有常用方法(使用-dataWithPDFInsideRect,NSBitmapImageRep的-initWithFocusedViewRect等)。但是,所有这些方法都将CALayer支持的NSView视为不是存在。我已经看过this StackOverflow帖子,但这是一个关于将CALayer树渲染到图像的问题,而不是包含常规NSView和图层支持视图的NSView。

感谢任何帮助,谢谢:)

4 个答案:

答案 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?

在类似情况下,这种方法对我有用。