【问题标题】:How to Screenshot NSView for Mac OS?如何为 Mac OS 截屏 NSView?
【发布时间】:2026-02-05 23:05:02
【问题描述】:

我目前有一个功能可以在 Mac 应用程序中创建整个窗口的屏幕截图。但是,我想针对特定的视图。我知道在 iOS 中您可以执行以下操作:

extension WKWebView {

    var screenshot: UIImage {
        if #available(iOS 10.0, *) {
            return UIGraphicsImageRenderer(size: bounds.size).image { _ in
                drawHierarchy(in: CGRect(origin: .zero, size: bounds.size), afterScreenUpdates: true)
            }
        } else {
            UIGraphicsBeginImageContext(bounds.size)
            drawHierarchy(in: bounds, afterScreenUpdates: true)
            let image = UIGraphicsGetImageFromCurrentImageContext()!
            return image
        }
    }
}

如何使用 AppKit 而不是 UIKit 将其转换为 Mac OS。以下是我当前计算的整个窗口截图的属性。

extension WKWebView {

    var screenshot: NSImage {
        let displayID = CGWindowID() // cgmaindisplayid
        let imageRef = CGDisplayCreateImage(displayID)
        return NSImage(cgImage: imageRef!, size: (NSScreen.main?.frame.size)!)
    }
}

【问题讨论】:

    标签: swift macos nsview


    【解决方案1】:

    你可以使用NSView方法func dataWithPDF(inside rect: NSRect) -> Data

    extension NSView {
        var image: NSImage? {
            return NSImage(data: dataWithPDF(inside: bounds))
        }
    }
    

    【讨论】:

    • 我认为这种方法并不总是有效,因为没有锁定图像就不会渲染图像
    • developer.apple.com/documentation/appkit/nsview/… 这些数据可以放在 NSPasteboard 对象上,写入文件,或用于创建 NSImage 对象。
    • 谢谢。但是,如果我使用您的代码,将在视网膜显示器上以 72 dpi 分辨率创建图像。
    • 数据与用于绘制视图的数据完全相同。 AFAIK没有损失
    • 抱歉……我错了。我猜是 HEIC 不支持超过 72 dpi 的更高分辨率。