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
Répondre
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.
En ce qui concerne l'auteur, cela ne doit pas être marqué comme la bonne réponse. –
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
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
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
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.
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/ –