307 votes

Comment faire pour capturer UIView à UIImage sans perte de qualité sur l’écran retina

Mon code fonctionne très bien pour les dispositifs normaux, mais crée des images floues sur les dispositifs de la rétine.

Quelqu'un sait-il d’une solution à mon problème ?

678voto

Tommy Points 56749

Passer de l'utilisation de UIGraphicsBeginImageContext de UIGraphicsBeginImageContextWithOptions (comme indiqué sur cette page). Passer 0,0 échelle (le troisième argument) et vous obtiendrez un contexte avec un facteur d'échelle égal à celui de l'écran.

UIGraphicsBeginImageContext utilise une échelle fixe facteur de 1.0, de sorte que vous êtes réellement obtenir exactement la même image sur un iPhone 4 que sur les autres iPhones. Je parie que soit l'iPhone 4 est l'application d'un filtre lorsque vous implicitement à l'échelle vers le haut ou juste votre cerveau est de ramasser sur elle étant moins forte que tout autour d'elle.

Donc, je suppose:

#import <QuartzCore/QuartzCore.h>

+ (UIImage *) imageWithView:(UIView *)view
{
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return img;
}

237voto

Dima Points 10869

L'actuel accepté réponse est maintenant hors de date, au moins si vous prenez en charge iOS 7.

Voici ce que vous devez les utiliser si vous ne soutenir iOS7+:

+ (UIImage *) imageWithView:(UIView *)view
{
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0f);
    [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:NO];
    UIImage * snapshotImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return snapshotImage;
}

Conformément à cet article, vous pouvez voir que le nouvel iOS7 méthode drawViewHierarchyInRect:afterScreenUpdates: est plusieurs fois plus rapide que l' renderInContext:. benchmark

24voto

Glogo Points 368

Pour améliorer les réponses par @Tommy et @Dima, utiliser la catégorie suivante pour restituer UIView into UIImage avec fond transparent et sans perte de qualité. Travail sur iOS7. (Ou simplement réutiliser cette méthode dans la mise en oeuvre, remplaçant `` référence avec votre image)

UIView+RenderViewToImage.h

UIView+RenderViewToImage.m

0voto

Mashhadi Points 1215

Quelques fois drawRect méthode fait problème, donc j’ai obtenu ces réponses plus appropriées. Trop avoir un oeil là-dessus UIImage capturer des UIView, coincé dans la méthode DrawRect

-6voto

Shafraz Buhary Points 300

Ajouter ceci à la méthode UIView catégorie

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