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?
risposta
[[NSImage alloc] initWithData:[view dataWithPDFInsideRect:[view bounds]]];
Grazie mille. – Debashis
+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
Obs: le ombre e l'angoloRadius verranno ignorati – codrut
I thinkt, Debashis sta pensando di più di cose come http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CocoaDrawingGuide/Images/Images.html#//apple_ref/doc/uid/TP40003290-CH208-BCIIIJFB
Saluti
il collegamento è ora rotto – Supertecnoboff
let dataOfView = view.dataWithPDFInsideRect(view.bounds)
let imageOfView = NSImage(data: dataOfView)
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)
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
Nota: non sempre funziona correttamente. Sto emettendo un'etichetta con un sistema di coordinate ruotato. – Ash
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
Quali metodi didn funziona e perché? –