2017-02-15 1 views
0

Je me sers ci-dessous le code pour récupérer toutes les images de la bibliothèque qui fonctionne très bien:obtenir des images miniatures dans la liste et de l'image en taille réelle en cliquant sur l'élément de la liste

func grabPhotos(){ 

    let imgManager = PHImageManager.default() 
    let requestOptions = PHImageRequestOptions() 
    requestOptions.isSynchronous = true 
    requestOptions.deliveryMode = .highQualityFormat 
    let fetchOptions = PHFetchOptions() 
    fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)] 
    if let fetchResults : PHFetchResult = PHAsset.fetchAssets(with: .image, options: fetchOptions){ 

     if fetchResults.count>0{ 

     for i in 0..<fetchResults.count{ 

     imgManager.requestImage(for: fetchResults.object(at: i), targetSize: CGSize(width:100, height: 100), contentMode: .aspectFill, options: requestOptions, resultHandler: { 

     image, error in 
     self.Galleryimages.append(image!) 

     print("array count is ",self.Galleryimages.count) 
     self.photoCollectionview.reloadData() 
     }) 
     } 

    } 
    } 
} 

Je montre toutes les images dans mon UICollectionView, mais je n'ai trouvé aucun moyen d'obtenir l'image originale lorsque je clique sur une image miniature. Je veux récupérer l'image originale (image en taille réelle) lorsque l'utilisateur clique sur une image miniature qui est remplie dans UICollectionView.

Merci.

+0

signifie que voulez-vous faire? –

+0

S'il vous plaît voir ma question éditée, je veux réellement aller chercher l'image de taille originale lorsque l'utilisateur clique sur une image miniature. –

+0

Vous ne stockez pas toutes les images dans un tableau. Que voulez-vous dire par ne pas être en mesure d'obtenir l'image originale? – KrishnaCA

Répondre

2

Pour charger l'image miniature.

Vous avez la solution après avoir fait trop de choses, peut-être que cela peut aider les autres. Voici les étapes pour le faire.

Etape 1: déclarer objet de PHFetchResult

var Galleryimages: PHFetchResult<PHAsset>! 

Etape 2: récupérer des résultats de la galerie à l'aide ci-dessous code:

func grabPhotos(){ 

Galleryimages = PHAsset.fetchAssets(with: PHAssetMediaType.image, options: nil) 

}

Etape 3: Afficher les images miniatures dans votre interface utilisateur (coll ectionview/Tableview) en utilisant le code ci-dessous:

let imageview = cell.viewWithTag(1) as! UIImageView 

PHImageManager.default().requestImage(for: (Galleryimages?[indexPath.row])!, targetSize: CGSize(width: 200, height: 200), contentMode: .aspectFill, options: nil) { (image: UIImage?, info: [AnyHashable: Any]?) -> Void in 
    imageview.image = image 
} 

Étape 4: Et enfin obtenir l'image en taille réelle en utilisant le code ci-dessous.

let options = PHImageRequestOptions() 
options.deliveryMode = .highQualityFormat 
options.resizeMode = .exact 

PHImageManager.default().requestImage(for: (Galleryimages[indexPath.row]), targetSize: PHImageManagerMaximumSize, contentMode: .aspectFill, options: options) { (image: UIImage?, info: [AnyHashable: Any]?) -> Void in 
    if let image = image { 
    //Use this originan image 
    } 
} 
0

Vous êtes en train de redimensionner des images lorsque U est extrait de PHAsset. Il faut donc utiliser

targetsize : PHImageManagerMaximumSize 

A partir de ce U peut obtenir une image originale avec sa taille d'origine. et pour votre collection, vous pouvez directement créer des vignettes et afficher des images. Ainsi, lorsque l'utilisateur appuie sur la vignette, vous pouvez maintenant afficher l'image originale

Veuillez utiliser autoreleasepool pour la gestion de la mémoire.

for(PHAsset *asset in self.assets) { 
    // This autorelease pool seems good (a1) 
    autoreleasepool { 
     NSLog(@"started requesting image %i", i); 
     [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeAspectFit options:[self imageRequestOptions] resultHandler:^(UIImage *image, NSDictionary *info) { 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       //you can add autorelease pool here as well (a2) 
       @autoreleasepool { 
        assetCount++; 
        NSError *error = [info objectForKey:PHImageErrorKey]; 
        if (error) NSLog(@"Image request error: %@",error); 
        else { 
         NSString *imagePath = [appDelegate.docsPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%i.png",i]]; 
         NSData *imageData = UIImagePNGRepresentation(image); 
         if(imageData) { 
          [imageData writeToFile:imagePath atomically:YES]; 
          [self.imagesArray addObject:imagePath]; 
         } 
         else { 
          NSLog(@"Couldn't write image data to file."); 
         } 
         [self checkAddComplete]; 
         NSLog(@"finished requesting image %i", i); 
        } 
       } //a2 ends here 
      }); 
     }]; 
     i++; 
    } // a1 ends here 
} 
+0

Vous avez raison d'utiliser 'PHImageManagerMaximumSize' comme paramètre. Cependant, cela ne vaut pas la peine de charger l'image en taille réelle juste pour une vignette. Il vaut mieux demander l'image en taille réelle uniquement en cliquant sur une vignette d'image et en ayant besoin d'afficher l'image en taille réelle. – Abizern

+0

@JeckyModi Si j'utilise PHImageManagerMaximumSize comme cible, mon application va planter en raison de la pression de la mémoire. C'est que j'ai utilisé 200 x 200 comme taille cible pour éviter le crash. Pouvez-vous expliquer le chemin complet dans votre réponse? –

+0

@SumeetPurohit vous pouvez utiliser autoreleasepool comme dans la réponse http://stackoverflow.com/questions/33274791/high-memory-usage-looping-through-phassets-and-calling-requestimageforasset S'il vous plaît voir la réponse que vous voulez –