Si prega di notare che questa domanda è circa CGLayer (che in genere si usa per disegnare fuori dallo schermo), non si tratta di CALayer.Qual è il codice corretto per salvare un CGLayer come file PNG?
In iOS, qual è il codice corretto per salvare un CGLayer come file PNG? Grazie!
Ancora, questo è CGLayer, non CALayer.
Si noti che è NON PUO uso UIGraphicsGetImageFromCurrentImageContext.
(Dalla documentazione, "Si può chiamare UIGraphicsGetImageFromCurrentImageContext solo quando un contesto grafico bitmap-based è il contesto grafico corrente.")
Si noti che è NON PUO uso renderInContext :. renderInContext: è strettamente per CALayers. I CGLayer sono completamente diversi.
Quindi, come è possibile convertire un CGLayer in un'immagine PNG? O in effetti, come eseguire il rendering di un CGLayer in una bitmap in qualche modo (ovviamente puoi salvarlo facilmente come immagine).
Più tardi ... Ken ha risposto a questa difficile domanda. Inserirò un codice di esempio lungo che può aiutare le persone. Grazie ancora Ken! Stupefacente!
-(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: Vedi aggiornamento. – kennytm
Ken è incredibile, l'hai fatto saltare fuori dall'acqua. Ottimo lavoro. Devi essere molto compiaciuto :) Fantastico .. Grazie ancora – Fattie
generoso! Grazie – Fattie