Macos NSWindows视图捕获到图像
更新:11月6日 多亏了我修改了我的问题。 在10.13上,我试图编写一个视图快照函数作为通用NSView或窗口扩展。以下是我作为窗口代表的看法: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
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
}
}