2009-07-11 11 views
21

Me gustaría crear un objeto UIImage desde el contexto gráfico actual. Más específicamente, mi caso de uso es una vista en la que el usuario puede dibujar líneas. Pueden dibujar incrementalmente. Después de que terminen, me gustaría crear un UIImage para representar su dibujo.Cómo crear un UIImage del contexto de gráficos actual?

Esto es lo que drawRect: parece que para mí ahora:

- (void)drawRect:(CGRect)rect 
{ 
CGContextRef c = UIGraphicsGetCurrentContext(); 

CGContextSaveGState(c); 
CGContextSetStrokeColorWithColor(c, [UIColor blackColor].CGColor); 
CGContextSetLineWidth(c,1.5f); 

for(CFIndex i = 0; i < CFArrayGetCount(_pathArray); i++) 
{ 
    CGPathRef path = CFArrayGetValueAtIndex(_pathArray, i); 
    CGContextAddPath(c, path); 
} 

CGContextStrokePath(c); 

CGContextRestoreGState(c); 
} 

... donde _pathArray es de tipo CFArrayRef, y se rellena cada vez que touchesEnded: se invoca. También tenga en cuenta que DrawRect: se puede invocar varias veces, a medida que el usuario dibuja.

Cuando el usuario termine, me gustaría crear un objeto UIImage que represente el contexto gráfico. ¿Alguna sugerencia sobre cómo hacer esto?

+0

Tanto de las respuestas a continuación el trabajo. Tenga en cuenta que hay una diferencia funcional entre los dos, que es que la representación de la capa en el contexto de la imagen también representará el fondo de la capa; llamando a drawRect: directamente no (en mi caso, no importa). Voy con el método de renderización de contexto de CALayer debido a las complejidades al llamar a drawRect: directamente (ver http://lists.apple.com/archives/Cocoa-dev/2002/Apr/msg01846.html para más detalles). ¡Gracias! – figelwump

Respuesta

42

necesita configurar el contexto gráfico primera:

UIGraphicsBeginImageContext(myView.bounds.size); 
[myView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
7

UIImage * image = UIGraphicsGetImageFromCurrentImageContext();

Si necesita conservar image, asegúrese de conservarlo.

EDITAR: Si desea guardar la salida de drawRect en una imagen, simplemente cree un contexto de mapa de bits usando UIGraphicsBeginImageContext y llame a su función drawRect con el nuevo contexto encuadernado. Es más fácil de hacer que guardar el CGContextRef con el que está trabajando dentro de drawRect - porque ese contexto puede no tener asociada la información de mapa de bits.

UIGraphicsBeginImageContext(view.bounds.size); 
[view drawRect: [myView bounds]]; 
UIImage * image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

También puede usar el enfoque mencionado por Kelvin. Si desea crear una imagen desde una vista más compleja como UIWebView, su método es más rápido. ¡Dibujar la capa de la vista no requiere actualizar la capa, solo requiere mover datos de imagen de un buffer a otro!

+0

Gracias por la respuesta, sin embargo, parece que no funciona. Agregué la línea: \t _signatureImage = UIGraphicsGetImageFromCurrentImageContext(); ... donde _signatureImage es una propiedad retenida. El objeto devuelto es nulo. De acuerdo con los documentos, UIGraphicsGetImageFromCurrentImageContext() está destinado para su uso solo si el contexto actual es un contexto de mapa de bits. En mi implementación actual de drawRect: no creo que sea el caso. Los documentos mencionan el uso de UIGraphicsBeginImageContext(), pero no estoy seguro de cómo se aplica en mi caso porque DrawRect puede invocarse varias veces. – figelwump

2

Swift Versión

func createImage(from view: UIView) -> UIImage { 
     UIGraphicsBeginImageContext(view.bounds.size) 
     view.layer.renderInContext(UIGraphicsGetCurrentContext()!) 
     let viewImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 

     return viewImage 
    } 
Cuestiones relacionadas