2012-03-14 4 views
2

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: enter image description here

drawed couche: enter image description here

Répondre

0

Pourquoi vous ouvrez un contexte d'image en premier lieu? Dessiner directement sur les couches ctx contexte passé en tant que deuxième argument de méthode. En outre, vous devez définir la propriété contentsScale de la couche sur [UIScreen mainScreen].scale.

Pour dessiner une image à l'échelle de l'appareil correct (pas nécessaire dans votre exemple) utiliser ceci:

void UIGraphicsBeginImageContextWithOptions(
    CGSize size, 
    BOOL opaque, 
    CGFloat scale // pass 0 to use screen scale 
); 

PS: En ce moment, je ne vois vraiment pas ce que vous voulez accomplir avec votre code!

+0

L'échelle de la nouvelle couche est correcte, j'ai besoin de découper l'écran en plusieurs petites couches. – changx

+0

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? –

+0

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

Questions connexes