ios uiimage core-graphics quartz-graphics

ios - ¿Cómo crear un UIImage desde el contexto gráfico actual?



core-graphics quartz-graphics (3)

Primero debes configurar el contexto de los gráficos:

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

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. Una vez que hayan terminado, me gustaría crear un UIImage para representar su dibujo.

Aquí está lo que DrawRect: me parece 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 del tipo CFArrayRef, y se llena cada vez que se tocaEnded: se invoca. También tenga en cuenta que drawRect: puede invocarse varias veces, como el usuario dibuja.

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


UIImage * image = UIGraphicsGetImageFromCurrentImageContext ();

Si necesitas mantener la image , ¡asegúrate de conservarla!

EDITAR: Si desea guardar la salida de drawRect en una imagen, simplemente cree un contexto de mapa de bits utilizando UIGraphicsBeginImageContext y llame a su función drawRect con el nuevo contexto enlazado. Es más fácil hacer que guardar el CGContextRef con el que está trabajando dentro de drawRect, ya que es posible que ese contexto no tenga información de mapa de bits asociada.

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

También puede utilizar el enfoque que Kelvin mencionó. 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 búfer a otro!


Versión rápida

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