Avec le code ci-dessous, la couche peinte CGContextDrawImage() a une qualité inférieure à celle du calque affiché d'origine. Quelques lignes dans l'image aliasée.Comment améliorer la qualité de CGImageRef pris à partir de la couche à l'écran?
Voici mon code
- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx
{
CGContextSaveGState(ctx);
UIGraphicsBeginImageContext(layer.bounds.size);
CGContextRef c = UIGraphicsGetCurrentContext();
CGContextSetShouldAntialias(c, YES);
CGContextSetAllowsAntialiasing(c, YES);
CGContextSetInterpolationQuality(c, kCGInterpolationHigh);
[self.view.layer renderInContext:c];
CGImageRef image = CGBitmapContextCreateImage(c);
UIGraphicsEndImageContext();
CGImageRef flipImage = CGImageCreateWithImageInRect(image, layer.bounds);
CGContextTranslateCTM(ctx, 0, layer.bounds.size.height);
CGContextScaleCTM(ctx, 1.0f, -1.0f);
CGContextSetShouldAntialias(ctx, YES);
CGContextSetAllowsAntialiasing(ctx, YES);
CGContextSetInterpolationQuality(ctx, kCGInterpolationHigh);
CGContextDrawImage(ctx, layer.bounds, flipImage);
CGContextRestoreGState(ctx);
LogMessage(@"drawLayer", 1, @"draw layer content");
}
Update 1
La couche peinte en drawLayer:
a un format différent de l'écran. Je veux découper l'écran en morceaux puis leur appliquer une animation.
couche originale:
drawed couche:
L'échelle de la nouvelle couche est correcte, j'ai besoin de découper l'écran en plusieurs petites couches. – changx
Eh bien, alors je vous ai déjà donné la réponse. Utilisez 'UIGraphicsBeginImageContextWithOptions'. Votre approche n'a toujours aucun sens. Pourquoi avez-vous besoin d'une couche séparée pour découper l'écran? –
Oui, vous avez raison! directement '[self.view.layer renderInContext: ctx]' pourrait compléter le créer, recadrer, dessiner des tâches, mais la qualité est toujours mauvaise, une idée? La raison pour laquelle j'ai besoin de plusieurs sous-couches est que chaque sous-couche sera retournée pour exposer la couche en dessous. – changx