Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 将包含一些Calayer的NSView渲染到NSImage_Objective C_Cocoa_Calayer_Nsview_Nsimage - Fatal编程技术网

Objective c 将包含一些Calayer的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和层

我有一个NSView,其中包含一个NSScrollView,其中包含一个CALayer支持的NSView。我尝试过将NSView捕获到NSImage中的所有常用方法(使用
-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生成中实现。什么也没发生