6

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

任何帮助表示赞赏,谢谢:)

4

4 回答 4

6

我发现这样做的唯一方法是使用 CGWindow API,例如:

CGImageRef cgimg = CGWindowListCreateImage(CGRectZero, kCGWindowListOptionIncludingWindow, [theWindow windowNumber], kCGWindowImageDefault);

然后剪掉与您的视图相对应的 CGImage 部分

-imageByCroppingToRect.

然后从裁剪的 CGImage 中制作一个 NSImage。请注意,如果该窗口的某些部分不在屏幕上,这将无法正常工作。

于 2010-12-30T19:27:32.160 回答
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];
于 2011-01-03T20:36:40.170 回答
0

你看过 Cocoa Drawing Guide 中的建议了吗?(“创建位图”

要直接绘制到位图中,请使用您想要的参数创建一个新的 NSBitmapImageRep 对象,并使用 NSGraphicsContext 的 graphicsContextWithBitmapImageRep: 方法来创建绘图上下文。使新上下文成为当前上下文并绘制。此技术仅在 Mac OS X v10.4 及更高版本中可用。或者,您可以创建一个 NSImage 对象(或屏幕外窗口),在其中绘制,然后捕获图像内容。所有版本的 Mac OS X 都支持这种技术。

这听起来类似于我熟悉的 iOS 解决方案(使用 UIGraphicsBeginImageContext 和 UIGraphicsGetImageFromCurrentImageContext),所以我希望它适用于您的视图。

于 2011-01-03T18:48:30.073 回答
0

请查看这篇文章的答案:如何将包含核心动画层的视图渲染到位图?

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

于 2011-02-01T11:55:39.327 回答