Rendering NSView enthält einige CALayers zu einem NSImage
-
12-10-2019 - |
Frage
Ich habe eine NSView, die eine NSScrollView enthält einen CALayer-backed NSView enthält. Ich habe versucht, all die üblichen Methoden zur Herstellung eines NSView in eine NSImage Erfassung (mit -dataWithPDFInsideRect
, NSBitmapImageRep des -initWithFocusedViewRect
, etc.) sind jedoch alle diese Verfahren behandeln die CALayer-backed NSView, als ob es nicht existiert. Ich habe schon gesehen, diese Stackoverflow Post, aber es war eine Frage über nur einen CALayer Baum auf ein Bild zu machen, nicht ein NSView sowohl regelmäßige NSView der und Schicht-backed Ansichten enthält.
Jede Hilfe ist willkommen, danke:)
Lösung
Der einzige Weg, fand ich, dies zu tun, ist die CGWindow API, so etwas wie zu verwenden:
CGImageRef cgimg = CGWindowListCreateImage(CGRectZero, kCGWindowListOptionIncludingWindow, [theWindow windowNumber], kCGWindowImageDefault);
anklemmen dann den Teil dieser CGImage dass entspricht Ihre Ansicht mit
-imageByCroppingToRect
.
Dann machen Sie eine NSImage aus dem beschnittenen CGImage. Denken Sie daran, dies wird nicht gut funktionieren, wenn Teile des Fensters offscreen sind.
Andere Tipps
Das funktioniert auf eine NSImage
einen Blick direkt zu zeichnen, obwohl ich es nicht mit einer Schicht-backed Ansicht versucht habe:
NSImage * i = [[NSImage alloc] initWithSize:[view frame].size];
[i lockFocus];
if ([view lockFocusIfCanDrawInContext:[NSGraphicsContext currentContext]]) {
[view displayRectIgnoringOpacity:[view frame] inContext:[NSGraphicsContext currentContext]];
[view unlockFocus];
}
[i unlockFocus];
NSData * d = [i TIFFRepresentation];
[d writeToFile:@"/path/to/my/test.tiff" atomically:YES];
[i release];
Haben Sie sich die Vorschläge in der Cocoa Zeichnung Guide? ( "Erstellen einer Bitmap" )
Um direkt in eine Bitmap zu zeichnen, erstellen Sie ein neues NSBitmapImageRep Objekt mit den Parametern, die Sie mögen, und verwenden Sie die graphicsContextWithBitmapImageRep: Methode der NSGraphicsContext eine Zeichnung Kontext zu schaffen. Machen Sie den neuen Kontext den aktuellen Kontext und zeichnen. Diese Technik ist nur in Mac OS X 10.4 und höher verfügbar. Alternativ können Sie auch ein NSImage Objekt (oder ein Off-Screen-Fenster), ziehen hinein, erstellen und dann die Bildinhalte erfassen. Diese Technik ist in allen Versionen von Mac OS X unterstützt.
Das klingt ähnlich wie die iOS-Lösung Ich bin vertraut mit (mit UIGraphicsBeginImageContext und UIGraphicsGetImageFromCurrentImageContext), damit ich es an der Arbeit für Ihre Ansicht erwarten würde.
haben Sie einen Blick auf die Antwort auf diesen Beitrag: Wie kann ich einen Blick machen die Core Animation Schichten in eine Bitmap enthält?
Dieser Ansatz ist für mich unter ähnlichen Umständen zu Ihrem eigenen.