6 votes

Chargement de l'image avec AFNetworking - Redimensionnement

Tout d'abord, j'utilise cette méthode AFNetworking :

[imageView setImageWithURL:[NSURL URLWithString="http://site.com/img.png"]];

1 - Cette méthode est-elle asynchrone ? L'image sera-t-elle mise en cache sur l'iPhone ?

2 - Comment puis-je recadrer/redimensionner cette image ? J'ai une image de 800x600 dans l'URL, mais mon UIImageView est de 400x400, je veux seulement que l'image de l'URL soit recadrée avant d'être affichée, pour avoir le même ratio, comme 600x600 (Ce n'est pas nécessaire d'être 400x400, seulement le même ratio). Comme dans l'application Facebook.

17voto

Rob Points 70987

Le redimensionnement a déjà été traité ailleurs, mais pour votre première question:

Cette méthode est-elle asynchrone?

Oui, elle est asynchrone. Vous pouvez utiliser des blocs de rappel si vous souhaitez traiter l'image, par exemple:

[imageView setImageWithURLRequest:request
                 placeholderImage:nil
                          success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {

                              // redimensionner l'image ici

                              // puis définir l'image de l'image view

                              imageView.image = image;
                          }
                         failure:nil];

Vous demandez ensuite:

Il va mettre en cache l'image sur iPhone?

Si vous cherchez simplement à mettre en cache en mémoire pour des raisons de performance, alors la réponse est un oui catégorique. Il utilise un NSCache (qui sera vidé en cas de pression mémoire). En passant, il mettra en cache l'image telle qu'elle est récupérée, sans refléter la redimension que vous faites après coup.

Si vous cherchez à mettre en cache dans un stockage persistant (c'est-à-dire un cache qui persistera même si vous arrêtez l'application et la redémarrez), cette question est un peu moins claire. AFNetworking prétend prendre en charge le caching sur disque grâce à son utilisation de NSURLCache, mais j'ai eu des problèmes pour le faire fonctionner sur iOS. Si vous avez besoin de caching en stockage persistant, je pourrais suggérer une variété d'autres catégories de UIImageView, comme SDWebImage.

Quoi qu'il en soit, pour la ligne officielle de AFNetworking sur le caching, je pourrais vous référer à la discussion sur le Caching dans le AFNetworking FAQ.


Si vous souhaitez un indicateur d'activité, vous pouvez:

UIActivityIndicatorView *activityIndicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
activityIndicatorView.center = self.imageView.center;
[self.view addSubview:activityIndicatorView];
[activityIndicatorView startAnimating];

[imageView setImageWithURLRequest:request
                 placeholderImage:nil
                          success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {

                              [activityIndicatorView removeFromSuperview];

                              // redimensionner l'image ici

                              // puis définir l'image de l'image view

                              imageView.image = image;
                          }
                          failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
                              [activityIndicatorView removeFromSuperview];

                              // gérer toute autre erreur que vous souhaitez ici
                          }];

2voto

iPatel Points 15121

Pour obtenir une image recadrée :

UIImage *croppedImg = nil;
CGRect cropRect = CGRectMake(COMME VOUS LE SOUHAITEZ);
croppedImg = [self croppIngimageByImageName:self.imageView.image toRect:cropRect];

Utilisez la méthode suivante qui renvoie UIImage (comme vous le souhaitez la taille de l'image)

- (UIImage *)croppIngimageByImageName:(UIImage *)imageToCrop toRect:(CGRect)rect
    {
        //CGRect CropRect = CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, rect.size.height+15);

        CGImageRef imageRef = CGImageCreateWithImageInRect([imageToCrop CGImage], rect);
        UIImage *cropped = [UIImage imageWithCGImage:imageRef];
        CGImageRelease(imageRef);

        return cropped;
    }

Ici vous obtenez une image recadrée renvoyée par la méthode ci-dessus ;

OU REDIMENSIONNEMENT

Et utilisez également la méthode suivante pour une hauteur et une largeur spécifiques avec une image pour redimensionner UIImage :

+ (UIImage*)resizeImage:(UIImage*)image withWidth:(int)width withHeight:(int)height
{
    CGSize newSize = CGSizeMake(width, height);
    float widthRatio = newSize.width/image.size.width;
    float heightRatio = newSize.height/image.size.height;

    if(widthRatio > heightRatio)
    {
        newSize=CGSizeMake(image.size.width*heightRatio,image.size.height*heightRatio);
    }
    else
    {
        newSize=CGSizeMake(image.size.width*widthRatio,image.size.height*widthRatio);
    }

    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
    [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return newImage;
}

Cette méthode renvoie NewImage, avec la taille spécifique que vous souhaitez.

0voto

Hemang Points 3422

À partir d'AFNetworking v.2.0, il y a AFCoreImageSerializer

Le sérialiseur de réponse utilisé pour créer une représentation d'image à partir de la réponse du serveur et des données de réponse. Par défaut, il s'agit d'une instance de AFImageResponseSerializer

Les sous-classes de AFImageResponseSerializer peuvent être utilisées pour effectuer un post-traitement, tel que la correction des couleurs, la détection des visages, ou d'autres effets.

Vous pouvez l'utiliser pour recadrer l'image avant de la définir sur UIImageView.

0voto

Steve Moser Points 1449

J'ai un exemple de code à ajouter à la réponse de Hemang.

Voilà à quoi sert AFImageResponseSerializer. Il suffit de changer l'échelle de l'image pour qu'elle corresponde à l'échelle de l'image que vous récupérez.

AFImageResponseSerializer *imageResponseSerializer = [self.avatarImageView imageResponseSerializer]; [imageResponseSerializer setImageScale:1.0];

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