如何获取NSView的"屏幕截图"?

Deb*_*his 11 macos cocoa objective-c nsview nsimage

我需要把一个内容拿出来NSView放在NSImage一个实验项目中.这可能吗?我做了一些谷歌搜索,尝试了我找到的两种方法 - 但它们并没有真正起作用.有什么建议?

Chu*_*uck 23

[[NSImage alloc] initWithData:[view dataWithPDFInsideRect:[view bounds]]];
Run Code Online (Sandbox Code Playgroud)

  • +1值得注意的是,虽然这是一般的正确方法,但有些情况下它不起作用,例如像NSOpenGLView这样的视图有自己的OpenGL渲染上下文.在这种情况下,您需要直接获取像素数据并从中创建一个位图代表,这有点不太整洁. (2认同)

Kla*_*aas 17

从WWDC 2012 Session 245(翻译为Swift):

let viewToCapture = self.window!.contentView!
let rep = viewToCapture.bitmapImageRepForCachingDisplayInRect(viewToCapture.bounds)!
viewToCapture.cacheDisplayInRect(viewToCapture.bounds, toBitmapImageRep: rep)

let img = NSImage(size: viewToCapture.bounds.size)
img.addRepresentation(rep)
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说是最好的解决方案,与 pdf 版本不同,这也说明了阴影和圆角。与窗口帽版本不同,这仅捕获当前视图。Obj C 代码:`- (NSImage *)screenCap { NSBitmapImageRep *bitmap = [self bitmapImageRepForCachingDisplayInRect:self.bounds]; [self cacheDisplayInRect:self.bounds toBitmapImageRep:bitmap]; NSImage *result = [[NSImage alloc] initWithSize:self.bounds.size]; [结果添加表示:位图]; 返回结果;}` (2认同)

Zel*_*lko 6

let dataOfView = view.dataWithPDFInsideRect(view.bounds)
let imageOfView = NSImage(data: dataOfView)
Run Code Online (Sandbox Code Playgroud)