Как мне сделать "скриншот" NSView?
Мне нужно взять содержимое NSView
и положить их в NSImage
, для экспериментального проекта. Это возможно? Я немного погуглил, попробовал два метода, которые нашел, но они не сработали. Какие-либо предложения?
5 ответов
[[NSImage alloc] initWithData:[view dataWithPDFInsideRect:[view bounds]]];
Из сессии 245 WWDC 2012 (перевод на 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)
let dataOfView = view.dataWithPDFInsideRect(view.bounds)
let imageOfView = NSImage(data: dataOfView)
I thinkt, Debashis is thinking more of things like http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CocoaDrawingGuide/Images/Images.html
Привет
NSView.bitmapImageRepForCachingDisplay()
(упомянутый в этом ответе ) неправильно отображает цвета в некоторых представлениях.
CGWindowListCreateImage()
отлично работает для меня.
Вот моя реализация:
extension NSView {
@objc func takeScreenshot() -> NSImage? {
let screenRect = self.rectInQuartzScreenCoordinates()
guard let window = self.window else {
assert(false); return nil
}
let windowID = CGWindowID(window.windowNumber)
guard let screenshot = CGWindowListCreateImage(screenRect, .optionIncludingWindow, windowID, []) else {
assert(false); return nil
}
return NSImage(cgImage: screenshot, size: self.frame.size)
}
}
Этот код использует методNSView.rectInQuartzScreenCoordinates()
. Чтобы реализовать это, вам сначала нужно преобразовать границы вашего представления в screenCoordinates, используяNSView
иNSWindow
методы, а затем вам нужно перевернуть координаты, как это .