2011-11-16 3 views
10

à vous tous experts graphiques, je me demandais lequel de ces deux méthodes est préférable pour le redimensionnement d'une UIImage:Quelle méthode pour redimensionner UIImage est meilleure et pourquoi?

Le premier que je suis venu à travers est simple et populaire et est le suivant:

-(UIImage *)resizeImage:(UIImage *)image width:(CGFloat)resizedWidth height:(CGFloat)resizedHeight 
{ 
    UIGraphicsBeginImageContext(CGSizeMake(resizedWidth ,resizedHeight)); 
    [image drawInRect:CGRectMake(0, 0, resizedWidth, resizedHeight)]; 
    UIImage *result = UIGraphicsGetImageFromCurrentImageContext();     
    UIGraphicsEndImageContext(); 
    return result; 
} 

la deuxième méthode que je trouve à ce lien http://iphonesdksnippets.com/post/2009/05/06/Resize-image-and-keep-aspect-ratio.aspx et semble accomplir la même chose que ci-dessus, mais il est beaucoup plus complexe (je ne comprends pas vraiment ce qui se passe dedans):

-(UIImage *)resizeImage:(UIImage *)image width:(CGFloat)resizedWidth height:(CGFloat)resizedHeight 
{ 
    CGImageRef imageRef = [image CGImage]; 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef bitmap = CGBitmapContextCreate(NULL, resizedWidth, resizedHeight, 8, 4 * resizedWidth, colorSpace, kCGImageAlphaPremultipliedFirst); 
    CGContextDrawImage(bitmap, CGRectMake(0, 0, resizedWidth, resizedHeight), imageRef); 
    CGImageRef ref = CGBitmapContextCreateImage(bitmap); 
    UIImage *result = [UIImage imageWithCGImage:ref]; 

    CGContextRelease(bitmap); 
    CGImageRelease(ref); 

    return result; 
} 

Alors m La question est, quelle est la meilleure façon et pourquoi?

Répondre

0

C'est une approche de haut niveau et de bas niveau.

Quel est le meilleur? Cela dépend de votre objectif. L'approche de haut niveau est plus lisible (pour moi), peut-être l'approche de bas niveau est une nanoseconde plus rapide (n'a pas testé cela).

Il est difficile de juger des algorithmes ...

+0

Approche de bas niveau = maintenir la qualité mieux après le redimensionnement? @tom –

+0

J'imagine que la méthode drawInRect d'UIImage utilisera CGContextDrawImage en interne ... – Tom

4

Le second est thread-safe.

+1

Pourquoi cela est-il perdu? 1: Parce que la déclaration est fausse? 2: Parce que le filetage est irellevant -> ce n'est pas le cas. Si vous souhaitez une application haute performance, il est recommandé de placer les tâches de redimensionnement dans un autre thread. – esbenr

1

Ceci est une réponse plutôt tardive, mais je vais juste aller de l'avant et l'ajouter de toute façon.

J'ai effectivement trouvé quelques différences de comportement entre les deux méthodes, en plus de prestanda.

Dans une application photo, j'ai une vue de caméra personnalisée qui envoie toute image prise à un éditeur d'image personnalisé. Dans l'application, les vues de caméra/éditeur personnalisées sont en mode paysage exclusif. Cependant, la fenêtre de la caméra native elle-même pas. Ainsi, chaque fois qu'une photo est prise en mode portrait, le résultat final est déformé. Ces distorsions sont facilement manipulées en retournant la largeur et la hauteur, chaque fois que la largeur < hauteur.

La première méthode des deux méthodes ci-dessus (la méthode simple) a abouti à une image qui a été tournée de 90 degrés et toujours déformée. La seconde, cependant, a redimensionné parfaitement l'image! Je suppose que cela a quelque chose à voir avec le comportement basé sur le contexte graphique. La deuxième méthode n'utilise pas ce contexte, et cela fonctionne parfaitement dans mon cas.

0

Il existe différentes manières de redimensionner une image. Même dans le cas où vous avez une nouvelle largeur et une nouvelle hauteur, vous pouvez soit redimensionner l'image à une nouvelle taille et ignorer les proportions, soit redimensionner l'image proportionnellement et recadrer à une nouvelle taille.

Il existe un projet qui a une API propre pour cela: https://github.com/mustangostang/UIImage-Resize. Il utilise la première approche :-)

Questions connexes