将包含一些CALayer的NSView渲染成NSImage

6
我有一个包含CALayer支持的NSView的NSScrollView的NSView。我已经尝试了所有通常的方法来捕获NSView到NSImage(使用-dataWithPDFInsideRect,NSBitmapImageRep的-initWithFocusedViewRect等)。但是,所有这些方法都将CALayer支持的NSView视为不存在。我已经看过这个StackOverflow帖子this,但它只是关于将CALayer树渲染成图像的问题,而不是包含常规NSView和支持层的NSView的问题。
感谢任何帮助:)
4个回答

6
我找到的唯一方法是使用CGWindow API,类似于:
CGImageRef cgimg = CGWindowListCreateImage(CGRectZero, kCGWindowListOptionIncludingWindow, [theWindow windowNumber], kCGWindowImageDefault);

使用-imageByCroppingToRect从CGImage中剪切出与您的视图相对应的部分。

然后从剪裁后的CGImage创建一个NSImage。 请注意,如果窗口的某些部分未显示在屏幕上,则此方法可能无法正常工作。


你可以在CGWindowListCreateImage的第一个参数中指定一个矩形区域,而不是之后再进行裁剪。 - ev0
@ev0 我尝试过了,但结果是一张空白的图片。 - Duck

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];

警告:在此 AppKit 构建中声明了-[NSView lockFocusIfCanDrawInContext:],但尚未实现。没有任何操作发生。 - Paresh Navadiya

0

0

您是否查看了Cocoa绘图指南中的建议?("创建位图")

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接