2010-07-14 18 views
9

Ich muss den Inhalt einer NSView nehmen und sie in eine NSImage, für ein experimentelles Projekt. Ist das möglich? Ich habe etwas gegoogelt, zwei Methoden ausprobiert, die ich gefunden habe - aber sie haben nicht wirklich funktioniert. Irgendwelche Vorschläge?Wie mache ich einen "Screenshot" eines NSView?

+4

Welche Methoden didn arbeite nicht und warum? –

Antwort

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

Vielen Dank. – Debashis

+2

+1 Es ist erwähnenswert, dass, obwohl dies im Allgemeinen der richtige Weg ist, es in einigen Fällen nicht funktionieren wird, zB Ansichten wie 'NSOpenGLView', die ihren eigenen OpenGL Renderkontext haben. In diesem Fall müssen Sie die Pixeldaten direkt abrufen und daraus eine Bitmap-Darstellung erstellen, die etwas weniger sauber ist. – walkytalky

+0

Obs: Schatten und EckenRadius wird ignoriert – codrut

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

Von WWDC 2012 Session 245 (übersetzt 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 lassen Sie rep = viewToCapture.bitmapImageRepForCachingDisplay (in: viewToCapture.bounds)! viewToCapture.cacheDisplay (in: viewToCapture.bounds, zu: rep) lassen img = NSImage (Größe: viewToCapture.bounds.size) img.addRepresentation (rep) – spacecash21

+0

Hinweis: immer korrekt funktioniert nicht. Ich habe ein Etikett mit einem gedrehten Koordinatensystem ausgegeben. – Ash

+0

Dies war die beste Lösung für mich, im Gegensatz zu der PDF-Version berücksichtigt dies auch Schatten und abgerundete Ecken. Im Gegensatz zur Window-Cap-Version erfasst dies nur die aktuelle Ansicht. Obj C-Code: '- (NSImage *) ScreenCap { \t NSBitmapImageRep * Bitmap = [self bitmapImageRepForCachingDisplayInRect: self.bounds]; \t [self cacheDisplayInRect: self.bounds zuBitmapImageRep: bitmap]; \t NSImage * Ergebnis = [[NSImage alloc] initWithSize: self.bounds.size]; \t [Ergebnis addRepräsentation: Bitmap]; \t Ergebnis zurückgeben; } ' – codrut

Verwandte Themen