Objective c 将包含一些Calayer的NSView渲染到NSImage
我有一个NSView,其中包含一个NSScrollView,其中包含一个CALayer支持的NSView。我尝试过将NSView捕获到NSImage中的所有常用方法(使用Objective c 将包含一些Calayer的NSView渲染到NSImage,objective-c,cocoa,calayer,nsview,nsimage,Objective C,Cocoa,Calayer,Nsview,Nsimage,我有一个NSView,其中包含一个NSScrollView,其中包含一个CALayer支持的NSView。我尝试过将NSView捕获到NSImage中的所有常用方法(使用-dataWithPDFInsideRect、NSBitmapImageRep的-initWithFocusedViewRect)但是,所有这些方法都将CALayer支持的NSView视为不存在。我已经看过StackOverflow的文章,但这是一个关于仅将CALayer树渲染为图像的问题,而不是一个同时包含常规NSView和层
-dataWithPDFInsideRect
、NSBitmapImageRep的-initWithFocusedViewRect
)但是,所有这些方法都将CALayer支持的NSView视为不存在。我已经看过StackOverflow的文章,但这是一个关于仅将CALayer树渲染为图像的问题,而不是一个同时包含常规NSView和层备份视图的NSView
非常感谢您的帮助,谢谢:)我发现要做到这一点的唯一方法是使用CGWindow API,例如:
CGImageRef cgimg=CGWindowListCreateImage(CGRectZero,KCGWindowListOption包括Windows、[TheWindowWindowNumber],kCGWindowImageDefault);
然后用剪切工具剪裁出与视图相对应的CG图像部分
-imageByCroppingToRect
然后从裁剪后的CG图像制作一个NSImage。
请注意,如果该窗口的某些部分不在屏幕上,这将无法正常工作。您是否查看了Cocoa绘图指南中的建议?() 要直接绘制到位图中,请使用所需参数创建新的NSBitmapImageRep对象,并使用NSGraphicsContext的graphicsContextWithBitmapImageRep:方法创建图形上下文。将新上下文设为当前上下文并绘制。此技术仅在Mac OS X v10.4及更高版本中可用。 或者,您可以创建NSImage对象(或屏幕外窗口),在其中绘制,然后捕获图像内容。所有版本的Mac OS X都支持此技术
这听起来类似于我熟悉的iOS解决方案(使用UIGraphicsBeginImageContext和UIGraphicsGetImageFromCurrentImageContext),因此我希望它适用于您的视图。这可以将视图直接绘制到
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];
请看一下这篇文章的答案:
这种方法在与您类似的情况下对我有效。您可以使用CGWindowListCreateImage中的第一个参数来捕获特定的矩形,而不是在之后进行裁剪。@ev0我尝试过,但结果是一个空白图像。警告一次:-[NSView lockFocusIfCanDrawInContext:]已声明但尚未在此AppKit生成中实现。什么也没发生