141 votes

Je peux charger une UIImage depuis une URL ?

J'ai une URL d'une image (obtenu à partir de UIImagePickerController) mais je n'ai plus l'image dans la mémoire (l'URL a été enregistré à partir d'une exécution précédente de l'application). Puis-je recharger la UIImage à partir de l'URL de nouveau?

Je vois que UIImage a un imageWithContentsOfFile: mais j'ai une URL. Puis-je utiliser NSData de dataWithContentsOfURL: pour lire l'URL?

-----EDIT1- - - - - @Daniel en réponse, j'ai essayé le code suivant mais ça ne fonctionne pas...

NSLog(@"%s %@", __PRETTY_FUNCTION__, photoURL);     
if (photoURL) {
    NSURL* aURL = [NSURL URLWithString:photoURL];
    NSData* data = [[NSData alloc] initWithContentsOfURL:aURL];
    self.photoImage = [UIImage imageWithData:data];
    [data release];
}

Quand je l'ai couru la console affiche:

-[PhotoBox willMoveToWindow:] file://localhost/Users/gary/Library/Application%20Support/iPhone%20Simulator/3.2/Media/DCIM/100APPLE/IMG_0004.JPG
*** -[NSURL length]: unrecognized selector sent to instance 0x536fbe0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSURL length]: unrecognized selector sent to instance 0x536fbe0'

En regardant la pile d'appel, je suis d'appeler URLWithString, qui appelle URLWithString:relativeToURL:, puis initWithString:relativeToURL:, puis _CFStringIsLegalURLString, puis CFStringGetLength, puis forwarding_prep_0, puis transfert, puis -[NSObject doesNotRecognizeSelector].

Des idées pourquoi mon NSString (photoURL adresse de l'est 0x536fbe0) ne répond pas à la longueur? Pourquoi ne fait-il dire qu'il n'a pas répondu à[NSURL longueur]? N'est-il pas de savoir que les param est un NSString, pas un NSURL?

------EDIT2----- OK, le seul problème avec du code est la chaîne de caractères de l'URL de la conversion. Si j'ai coder en dur la chaîne, tout le reste fonctionne bien. Si quelque chose est incorrect avec mon NSString et si je ne peux pas comprendre, je suppose qu'il faut aller dans une autre question. Avec cette ligne insérée (j'ai collé le chemin d'accès à partir de la console de log ci-dessus), il fonctionne très bien:

photoURL = @"file://localhost/Users/gary/Library/Application%20Support/iPhone%20Simulator/3.2/Media/DCIM/100APPLE/IMG_0004.JPG";

328voto

Daniel Blezek Points 2682

Vous pouvez le faire de cette manière (de manière synchrone mais compacte):

 UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:MyURL]]];
 

Une meilleure approche consiste à utiliser les LazyTableImages d’Apple pour préserver l’interactivité.

27voto

Muhammad Hassan Points 755

Vous pouvez essayer SDWebImage , il fournit:

  1. Chargement asynchrone
  2. Mise en cache pour une utilisation hors connexion
  3. Placez l'image de titulaire à apparaître lors du chargement
  4. Fonctionne bien avec UITableView

Exemple rapide:

     [cell.imageView setImageWithURL:[NSURL URLWithString:@"http://www.domain.com/path/to/image.jpg"] placeholderImage:[UIImage imageNamed:@"placeholder.png"]];
 

13voto

user3763002 Points 61

Et la version rapide:

    let url = NSURL.URLWithString("http://live-wallpaper.net/iphone/img/app/i/p/iphone-4s-wallpapers-mobile-backgrounds-dark_2466f886de3472ef1fa968033f1da3e1_raw_1087fae1932cec8837695934b7eb1250_raw.jpg");
    var err: NSError?
    var imageData :NSData = NSData.dataWithContentsOfURL(url,options: NSDataReadingOptions.DataReadingMappedIfSafe, error: &err)
    var bgImage = UIImage(data:imageData)
 

7voto

iTroyd23 Points 1705

récupérez DLImageLoader et essayez le code suivant

    [DLImageLoader loadImageFromURL:imageURL
                          completed:^(NSError *error, NSData *imgData) {
                              imageView.image = [UIImage imageWithData:imgData];
                              [imageView setContentMode:UIViewContentModeCenter];

                          }];
 

Un autre exemple typique d'utilisation de DLImageLoader dans le monde réel, qui peut aider quelqu'un ...

 PFObject *aFacebookUser = [self.fbFriends objectAtIndex:thisRow];
NSString *facebookImageURL = [NSString stringWithFormat:
    @"http://graph.facebook.com/%@/picture?type=large",
    [aFacebookUser objectForKey:@"id"] ];

__weak UIImageView *loadMe = self.userSmallAvatarImage;
[DLImageLoader loadImageFromURL:facebookImageURL
   completed:^(NSError *error, NSData *imgData)
    {
    if ( loadMe == nil ) return;

    if (error == nil)
        {
        UIImage *image = [UIImage imageWithData:imgData];
        image = [image ourImageScaler];
        loadMe.image = image;
        }
    else
        {
        // an error when loading the image from the net
        }
    }];
 

4voto

marcc Points 8513

Découvrez les AsyncImageView fournis ici . Un bon exemple de code, et pourrait même être utilisable directement pour vous.

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