Macos NSWindows视图捕获到图像

Macos NSWindows视图捕获到图像,macos,swift3,Macos,Swift3,更新:11月6日 多亏了我修改了我的问题。 在10.13上,我试图编写一个视图快照函数作为通用NSView或窗口扩展。以下是我作为窗口代表的看法: var snapshot : NSImage? { get { guard let window = self.window, let view = self.window!.contentView else { return nil } var rect = view.bounds rect

更新:11月6日

多亏了我修改了我的问题。 在10.13上,我试图编写一个视图快照函数作为通用NSView或窗口扩展。以下是我作为窗口代表的看法:

var snapshot : NSImage? {
    get {
        guard let window = self.window, let view = self.window!.contentView else { return nil }

        var rect = view.bounds
        rect = view.convert(rect, to: nil)
        rect = window.convertToScreen(rect)

        //  Adjust for titlebar; kTitleUtility = 16, kTitleNormal = 22
        let delta : CGFloat = CGFloat((window.styleMask.contains(.utilityWindow) ? kTitleUtility : kTitleNormal))
        rect.origin.y += delta
        rect.size.height += delta*2

        Swift.print("rect: \(rect)")

        let cgImage = CGWindowListCreateImage(rect, .optionIncludingWindow,
                                              CGWindowID(window.windowNumber), .bestResolution)
        let image = NSImage(cgImage: cgImage!, size: rect.size)

        return image
    }
}
我的目标是获取窗口的“展平”快照。最初,我在文档图标拖动中使用此图像

它的行为很奇怪。它一开始似乎工作-窗口在中间,但随后产生的图像是不同的-更小,尤其是当窗口在屏幕上向上或向下移动时

我认为rect捕获错误?

使用:

要保存图像,请使用以下方法:

let dest = CGImageDestinationCreateWithURL(url, "public.jpeg", 1, nil)
CGImageDestinationAddImage(destination, image, nil)
CGImageDestinationFinalize(destination)
请注意,屏幕坐标是翻转的。从文档中:

矩形的坐标必须在屏幕坐标中指定,其中屏幕原点位于主显示器的左上角,y轴值向下增加


除了pointum的答案之外,我还提出了以下建议:

var snapshot : NSImage? {
    get {
        guard let window = self.window, let view = self.window!.contentView else { return nil }

        let inf = CGFloat(FP_INFINITE)
        let null = CGRect(x: inf, y: inf, width: 0, height: 0)

        let cgImage = CGWindowListCreateImage(null, .optionIncludingWindow,
                                              CGWindowID(window.windowNumber), .bestResolution)
        let image = NSImage(cgImage: cgImage!, size: view.bounds.size)

        return image
    }
}

因为我只需要一个窗口,所以指定“null”就可以了。如果你知道去哪里看的话,所有其他的都失败了,文档:o.

更近一点,但是获取“rect”是关键——不是这样:
var rect=window.frameRect(forContentRect:view.frame);rect.origin=window.frame.origin
var snapshot : NSImage? {
    get {
        guard let window = self.window, let view = self.window!.contentView else { return nil }

        let inf = CGFloat(FP_INFINITE)
        let null = CGRect(x: inf, y: inf, width: 0, height: 0)

        let cgImage = CGWindowListCreateImage(null, .optionIncludingWindow,
                                              CGWindowID(window.windowNumber), .bestResolution)
        let image = NSImage(cgImage: cgImage!, size: view.bounds.size)

        return image
    }
}