2010-06-12 6 views
4

Quel est le moyen le plus efficace pour créer une vignette à partir d'une image Web arbitraire dans l'iPhone?Création de vignettes efficace sur l'iPhone

+1

ImageIO est toujours le plus rapide à partir de 2014. Pour un bon résumé des techniques supplémentaires, reportez-vous à cet article: http://nshipster.com/image-resizing/ –

Répondre

-3

La seule façon que je l'ai trouvé à ce jour qui fonctionne sur toutes les images est de le montrer dans un ImageView avec la bonne taille, puis créer une image bitmap de ce point de vue.

Loin d'être efficace, cependant.

+0

En ce qui concerne l'auteur, cela ne doit pas être marqué comme la bonne réponse. –

1
+0

Donne-moi "CGBitmapContextCreate: espace de couleurs non supporté." au premier essai. Après avoir vérifié les commentaires, il semble que la portée de cette bibliothèque est très limitée. Je ne peux pas supposer une grande partie des images (autres que ce sont PNG ou JPEG). – hpique

+0

Cela est dû au fait que l'API est très pointilleuse sur la relation entre la résolution en bits, l'alpha et l'espace de couleurs. Vous devez vérifier que l'image a la configuration correcte et ensuite créer une nouvelle image correctement formatée si ce n'est pas le cas. C'est vraiment inévitable. Je ne pense pas que quiconque a fait un redimensionnement générique qui fonctionne avec tout. – TechZen

+0

Comment puis-je vérifier s'il a la bonne configuration et ensuite créer une image correctement formatée si ce n'est pas le cas? – hpique

8

la comparaison de deux méthode pour rapide création de la miniature de l'image voir ce link détail http://www.cocoaintheshell.com/2011/01/uiimage-scaling-imageio/ ou http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way/

pour l'avenir, il suffit de copier le code coller de premier

Première méthode, en utilisant UIKit

void)buildGallery 
{ 
    for (NSUInteger i = 0; i < kMaxPictures; i++) 
    { 
     NSInteger imgTag = i + 1; 
     NYXPictureView* v = [[NYXPictureView alloc] initWithFrame:(CGRect){.origin.x = x, .origin.y = y, .size = _thumbSize}]; 
     NSString* imgPath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%d", imgTag] ofType:@"jpg"]; 
     UIImage* fullImage = [[UIImage alloc] initWithContentsOfFile:imgPath]; 
     [v setImage:[fullImage imageScaledToFitSize:_thumbSize]]; 
     [fullImage release]; 
} 

Résultats des bancs m'a donné les résultats suivants:

  • Temps Profiler: 4233ms
  • octets en direct: 695KB
  • octets global utilisé: 78.96Mb

méthode En second lieu, en utilisant ImageIO

-(void)buildGallery 
{ 
    for (NSUInteger i = 0; i < kMaxPictures; i++) 
    { 
     NSInteger imgTag = i + 1; 
     NYXPictureView* v = [[NYXPictureView alloc] initWithFrame:(CGRect){.origin.x = x, .origin.y = y, .size = _thumbSize}]; 
     NSString* imgPath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%d", imgTag] ofType:@"jpg"]; 
     CGImageSourceRef src = CGImageSourceCreateWithURL((CFURLRef)[NSURL fileURLWithPath:imgPath], NULL); 
     CFDictionaryRef options = (CFDictionaryRef)[[NSDictionary alloc] initWithObjectsAndKeys:(id)kCFBooleanTrue, (id)kCGImageSourceCreateThumbnailWithTransform, (id)kCFBooleanTrue, (id)kCGImageSourceCreateThumbnailFromImageIfAbsent, (id)[NSNumber numberWithDouble:_maxSize], (id)kCGImageSourceThumbnailMaxPixelSize, nil]; 
     CGImageRef thumbnail = CGImageSourceCreateThumbnailAtIndex(src, 0, options); // Create scaled image 
     CFRelease(options); 
     CFRelease(src); 
     UIImage* img = [[UIImage alloc] initWithCGImage:thumbnail]; 
     [v setImage:img]; 
     [img release]; 
     CGImageRelease(thumbnail); 
    } 

il m'a donné ceci:

  • Temps Profiler: 3433ms
  • octets en direct: 681KB
  • octets global utilisé: 77.63Mb

Vous pouvez voir que l'utilisation ImageIO est environ 19% plus rapide que UIKit, et utilise aussi légèrement moins de mémoire.

Questions connexes