2010-12-23 16 views
6

Tengo un NSView que contiene un NSScrollView que contiene un NSView respaldado por CALayer. Probé todos los métodos habituales para capturar un NSView en un NSImage (utilizando -dataWithPDFInsideRect, -initWithFocusedViewRect de NSBitmapImageRep, etc.) Sin embargo, todos estos métodos tratan el NSView respaldado por CALayer como si no existiera. Ya he visto this publicación de StackOverflow, pero era una pregunta sobre la representación de solo un árbol CALayer en una imagen, no una NSView que contenga tanto NSView normales como vistas respaldadas por capa.Representación de NSView que contiene algunos CALayers en un NSImage

cualquier ayuda se agradece, gracias :)

Respuesta

6

La única manera que encontré para hacer esto es utilizar el CGWindow API, algo así como:

CGImageRef cgimg = CGWindowListCreateImage(CGRectZero, kCGWindowListOptionIncludingWindow, [theWindow windowNumber], kCGWindowImageDefault); 

luego cortar la parte de ese CGImage que corresponde a su vista con

-imageByCroppingToRect.

A continuación, haga un NSImage del recortado CGImage. Tenga en cuenta que esto no funcionará si partes de esa ventana están fuera de la pantalla.

+0

En lugar de hacer el recorte después, puede usar el primer argumento en CGWindowListCreateImage para capturar solo un rectángulo específico. – ev0

+0

@ ev0 Lo intenté pero el resultado fue una imagen en blanco. – SpaceDog

-1

¿Ha mirado las sugerencias en la Guía de dibujo de cacao? ("Creating a Bitmap")

Para dibujar directamente en un mapa de bits, crear un nuevo objeto NSBitmapImageRep con los parámetros que desee y use el graphicsContextWithBitmapImageRep: Forma de NSGraphicsContext para crear un contexto de dibujo. Haga que el nuevo contexto sea el contexto actual y dibuje. Esta técnica está disponible solo en Mac OS X v10.4 y posterior. Como alternativa, puede crear un objeto NSImage (o una ventana fuera de pantalla), dibujar en él y luego capturar el contenido de la imagen. Esta técnica es compatible con todas las versiones de Mac OS X.

Eso suena similar a la solución IOS Estoy familiarizado con (usando UIGraphicsBeginImageContext y UIGraphicsGetImageFromCurrentImageContext) por lo que cabe esperar que funcione para su vista.

2

Esto funciona para dibujar una vista directamente a un NSImage, aunque no lo he probado con miras capa respaldados:

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]; 
+0

Advertencia una vez: - [NSView lockFocusIfCanDrawInContext:] se declara pero aún no se implementa en esta compilación de AppKit. no pasa nada –

Cuestiones relacionadas