Tenga en cuenta que esta pregunta es sobre CGLayer (que normalmente utiliza para dibujar fuera de la pantalla), no se trata de CALayer.¿Cuál es el código correcto para guardar un CGLayer como un archivo PNG?
En iOS, ¿cuál es el código correcto para guardar un CGLayer como un archivo PNG? ¡Gracias!
De nuevo, eso es CGLayer, no CALayer.
Tenga en cuenta que NO PUEDE uso UIGraphicsGetImageFromCurrentImageContext.
(De la documentación, "Usted puede llamar UIGraphicsGetImageFromCurrentImageContext sólo cuando un contexto gráfico basado en mapa de bits es el contexto gráfico actual.")
Tenga en cuenta que NO PUEDE uso renderInContext :. renderInContext: es estrictamente para CALayers. CGLayers son totalmente diferentes.
Entonces, ¿cómo se puede convertir un CGLayer en una imagen PNG? O, de hecho, cómo convertir un CGLayer en un mapa de bits de alguna manera (por supuesto, puedes guardarlo fácilmente como una imagen).
Más tarde ... Ken ha respondido a esta difícil pregunta. Pegaré en un código de ejemplo largo que puede ayudar a las personas. Gracias de nuevo Ken! ¡Asombroso!
-(void)drawingExperimentation
{
// this code uses the ASTOUNDING solution by KENNYTM -- Oct/Nov2010
//
// create a CGLayer for offscreen drawing
// note. for "yourContext", ideally it should be a context from your screen, ie the
// context you "normally get" in one of your drawRect routines associated with
// drawing to the screen normally.
// UIGraphicsGetCurrentContext() also normally works but you could have colorspace woes
// so create the CGLayer called notepad...
CGLayerRef notepad = CGLayerCreateWithContext(yourContext,CGSizeMake(1500,1500), NULL);
CGContextRef notepadContext = CGLayerGetContext(notepad);
// you can for example write an image in to notepad
CGImageRef imageExamp = [[UIImage imageWithContentsOfFile:
[[NSBundle mainBundle] pathForResource:@"smallTestImage" ofType:@"png"] ] CGImage];
CGContextDrawImage(notepadContext, CGRectMake(100,100, 50,50), imageExamp);
// setting the colorspace may or may not be relevant to you
CGContextSetFillColorSpace(notepadContext, CGColorSpaceCreateDeviceRGB());
// you can draw to notepad as much as you like in the normal way
// don't forget to push it's context on and off your work space so you can draw to it
UIGraphicsPushContext(notepadContext);
// set the colors
CGContextSetRGBFillColor(notepadContext, 0.15,0.25,0.35, 0.45);
// draw rects
UIRectFill(CGRectMake(x,y,w,h));
// draw ovals, filled stroked or whatever you wish
UIBezierPath* d = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(x,y,w,h)];
[d fill];
// draw cubic and other curves
UIBezierPath *longPath;
longPath.lineWidth = 42;
longPath.lineCapStyle = kCGLineCapRound;
longPath.lineJoinStyle = kCGLineJoinRound;
[longPath moveToPoint:p];
[longPath addCurveToPoint:q controlPoint1:r controlPoint2:s];
[longPath addCurveToPoint:a controlPoint1:b controlPoint2:c];
[longPath addCurveToPoint:m controlPoint1:n controlPoint2:o];
[longPath closePath];
[longPath stroke];
UIGraphicsPopContext();
// so now you have a nice CGLayer.
// how to save it to a file?
// you can save it to a file using the amazing KENNY-TM-METHOD !!!
UIGraphicsBeginImageContext(CGLayerGetSize(notepad));
CGContextRef rr = UIGraphicsGetCurrentContext();
CGContextDrawLayerAtPoint(rr, CGPointZero, notepad);
UIImage* ii = UIGraphicsGetImageFromCurrentImageContext();
NSData* pp = UIImagePNGRepresentation(ii);
[pp writeToFile:@"foo.png" atomically:YES];
UIGraphicsEndImageContext();
// you may prefer to look at it like this:
UIGraphicsBeginImageContext(CGLayerGetSize(notepad));
CGContextDrawLayerAtPoint(UIGraphicsGetCurrentContext(), CGPointZero, notepad);
[UIImagePNGRepresentation(UIGraphicsGetImageFromCurrentImageContext()) writeToFile:@"foo.png" atomically:YES];
UIGraphicsEndImageContext();
// there are three clever steps in the KENNY-TM-METHOD:
// - start a new UIGraphics image context
// - CGContextDrawLayerAtPoint which can, in fact, draw a CGLayer
// - just use the usual UIImagePNGRepresentation to convert to a png
// done! a miracle
// if you are testing on your mac-simulator, you'll find the file
// simply in the main drive directory
return;
}
@ Joe: Ver actualización. – kennytm
Ken es increíble, lo has volado fuera del agua. Buen trabajo. Debes ser muy presumido :) Increíble ... ¡Gracias de nuevo – Fattie
bountied! Gracias – Fattie