2010-07-14 18 views
9

Devo prendere il contenuto di un NSView e inserirli in un NSImage, per un progetto sperimentale. È possibile? Ho fatto qualche ricerca su Google, ho provato due metodi che ho trovato, ma non funzionavano davvero. Eventuali suggerimenti?Come si acquisisce uno "screenshot" di un NSView?

+4

Quali metodi didn funziona e perché? –

risposta

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

Grazie mille. – Debashis

+2

+1 Vale la pena notare che, sebbene questo sia il modo giusto in generale, ci sono alcuni casi in cui non funzionerà, ad esempio viste come 'NSOpenGLView' che hanno il proprio contesto di rendering OpenGL. In tal caso è necessario ottenere direttamente i dati dei pixel e creare da essi una rappresentazione bitmap, che è un po 'meno accurata. – walkytalky

+0

Obs: le ombre e l'angoloRadius verranno ignorati – codrut

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

Da WWDC 2012 Session 245 (tradotto in 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 (in: viewToCapture.bounds, a: rep) diamo img = NSImage (dimensioni: viewToCapture.bounds.size) img.addRepresentation (rep) – spacecash21

+0

Nota: non sempre funziona correttamente. Sto emettendo un'etichetta con un sistema di coordinate ruotato. – Ash

+0

Questa è stata la soluzione migliore per me, a differenza della versione pdf, questo spiega anche le ombre e gli angoli arrotondati. A differenza della versione con tappo finestra, questa cattura solo la vista corrente. Obj C code: '- (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 [result addRepresentation: bitmap]; \t risultato di ritorno; } ' – codrut

Problemi correlati