Как мне сделать "скриншот" 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)

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методы, а затем вам нужно перевернуть координаты, как это .

Другие вопросы по тегам