2010-07-14 2 views
9

Мне нужно взять содержимое NSView и поместить их в NSImage, для экспериментального проекта. Это возможно? Я сделал несколько Googling, попробовал два метода, которые я нашел, но они на самом деле не работали. Какие-либо предложения?Как сделать снимок экрана для NSView?

+4

Какие методы Бесполезный Работа и почему? –

ответ

19
[[NSImage alloc] initWithData:[view dataWithPDFInsideRect:[view bounds]]]; 
+0

спасибо. – Debashis

+2

+1 Стоит отметить, что, хотя это правильный путь в целом, есть случаи, когда он не будет работать, например, такие как NSOpenGLView, которые имеют свой собственный контекст рендеринга OpenGL. В этом случае вам нужно получить данные о пикселях напрямую и создать из него растровое изображение, которое немного менее аккуратно. – walkytalky

+0

Obs: тени и cornerRadius будут проигнорированы – codrut

6
let dataOfView = view.dataWithPDFInsideRect(view.bounds) 
let imageOfView = NSImage(data: dataOfView) 
11

С WWDC 2012 Session 245 (в переводе на 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) 
+0

swift 3 let rep = viewToCapture.bitmapImageRepForCachingDisplay (in: viewToCapture.bounds)! viewToCapture.cacheDisplay (в: viewToCapture.bounds, чтобы: реп) пусть IMG = NSImage (размер: viewToCapture.bounds.size) img.addRepresentation (реп) – spacecash21

+0

Примечание: не всегда работает правильно. Я выпустил ярлык с вращающейся системой координат. – Ash

+0

Это было лучшее решение для меня, в отличие от pdf-версии, это также объясняет тени и закругленные углы. В отличие от версии окна, это только фиксирует текущее представление. Obj C-код: '- (NSImage *) ScreenCap { \t NSBitmapImageRep * растровый = [само bitmapImageRepForCachingDisplayInRect: self.bounds]; \t [self cacheDisplayInRect: self.bounds toBitmapImageRep: bitmap]; \t NSImage * result = [[NSImage alloc] initWithSize: self.bounds.size]; \t [result addRepresentation: bitmap]; \t результат возврата; } ' – codrut

Смежные вопросы