2010-07-14 14 views
9

Necesito tomar los contenidos de NSView y ponerlos en un NSImage, para un proyecto experimental. es posible? Hice algunas búsquedas en Google, probé dos métodos que encontré, pero en realidad no funcionaron. ¿Alguna sugerencia?¿Cómo se toma una "captura de pantalla" de un NSView?

+4

Qué dejase métodos no funciona y por qué? –

Respuesta

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

Muchas gracias. – Debashis

+2

+1 Vale la pena señalar que, aunque esta es la manera correcta en general, hay algunos casos en los que no funcionará, por ejemplo, vistas como 'NSOpenGLView' que tienen su propio contexto de representación de OpenGL. En ese caso, debe obtener los datos de píxeles directamente y crear un representante de mapa de bits a partir de él, que es un poco menos claro. – walkytalky

+0

Obs: sombras y esquinaRadius se ignorará – codrut

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

De WWDC 2012 Sesión 245 (traducido a 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 (en: viewToCapture.bounds)! viewToCapture.cacheDisplay (en: viewToCapture.bounds, a: REP) vamos img = NSImage (tamaño: viewToCapture.bounds.size) img.addRepresentation (rep) – spacecash21

+0

Nota: no siempre funciona correctamente. Estoy emitiendo una etiqueta que tiene un sistema de coordenadas rotado. – Ash

+0

Esta fue la mejor solución para mí, a diferencia de la versión en pdf, esto también explica las sombras y las esquinas redondeadas. A diferencia de la versión de tapa de ventana, esto solo captura la vista actual. Obj Código C: '- (NSImage *) screenCap { \t NSBitmapImageRep * bitmap = [self bitmapImageRepForCachingDisplayInRect: self.bounds]; \t [self cacheDisplayInRect: self.bounds toBitmapImageRep: bitmap]; \t NSImage * result = [[NSImage alloc] initWithSize: self.bounds.size]; \t [resultado addRepresentation: bitmap]; \t resultado de devolución; } ' – codrut

Cuestiones relacionadas