2 votes

Prendre une capture d'écran de cercle IOS

Je prends une capture d'écran de quelques UIButtons qui sont des cercles d'environ 500 de largeur et 500 de hauteur. Comme la capture d'écran ne peut être faite qu'en forme carrée, et je ne voulais pas de coins blancs autour de l'image j'ai utilisé ce code :

UIGraphicsBeginImageContext(self.Button3.layer.bounds.size);
[self.Button3.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage* image2 = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

    NSData* data = UIImagePNGRepresentation(image);
    [data writeToFile:BusinessCardPath atomically:YES];

Cela fonctionne parfaitement, cela me renvoie une photo uniquement du cercle sans coins blancs. Mais cela ne peut être agrandi car il perdra des pixels, et cela n'inclut pas dans la capture tous les éléments tels que les UILabels qui sont au-dessus du UIButton, mais qui ne sont pas une sous-vue du UIButton.

Si j'utilise ce code :

CGSize imageSize = CGSizeMake(310, 310);

UIGraphicsBeginImageContext(self.Button3.layer.bounds.size);

CGContextRef context = UIGraphicsGetCurrentContext();
/*CGContextTranslateCTM(context, -5, -50);*/
// Parcourir toutes les fenêtres de l'arrière vers l'avant
for (UIWindow *window in [[UIApplication sharedApplication] windows])
{
    if (![window respondsToSelector:@selector(screen)] || [window screen] == [UIScreen mainScreen])
    {
        // -renderInContext: rend dans l'espace de coordonnées de la couche,
        // nous devons donc d'abord appliquer la géométrie de la couche au contexte graphique
        CGContextSaveGState(context);
        // Centrer le contexte autour du point d'ancrage de la fenêtre
        CGContextTranslateCTM(context, [window center].x, [window center].y);
        // Appliquer la transformation de la fenêtre autour du point d'ancrage
        CGContextConcatCTM(context, [window transform]);
        // Décalage par la partie des limites à gauche et au-dessus du point d'ancrage
        CGContextTranslateCTM(context,
                              -[window bounds].size.width * [[window layer] anchorPoint].x,
                              -[window bounds].size.height * [[window layer] anchorPoint].y);

        // Rendre la hiérarchie des couches dans le contexte actuel
        [[window layer] renderInContext:context];

        // Restaurer le contexte
        CGContextRestoreGState(context);
    }
}

// Récupérer l'image de la capture d'écran
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

...je obtiens l'effet opposé. Les éléments au-dessus sont inclus dans la capture, à haute résolution, mais les coins blancs autour de l'image sont là.

2voto

Nick Terry Points 171

Vous pouvez utiliser un CAShapeLayer pour masquer des portions de l'image. La propriété .path est utilisée pour définir la zone qui sera rendue.

UIImageView *myImageView = [UIImageView alloc] init];
myImageView.image = [UIImage imageNamed:@"anImage.gif"];
[myImageView setClipsToBounds:YES];

UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:myImageView.bounds byRoundingCorners:UIRectCornerAllCorners cornerRadii:CGSizeMake(48, 48)];
CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.frame = myImageView.bounds;
maskLayer.path = maskPath.CGPath;

myImageView.layer.mask = maskLayer;

Cela devrait vous donner une image circulaire. Vous devrez peut-être jouer avec le rayon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X