2017-02-15 11 views
0

Так я использую ниже код, чтобы извлечь все изображения из библиотеки, которая работает отлично:получить уменьшенные изображения в списке и полноразмерное изображение при жмем на элементе списка

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() 
     }) 
     } 

    } 
    } 
} 

Я показываю все изображения в моем UICollectionView, но я не нашел способа получить исходное изображение при каждом нажатии на любое уменьшенное изображение. Я хочу получить исходное изображение (полноразмерное изображение), когда пользователь нажимает на любое уменьшенное изображение, которое заполняется в UICollectionView.

спасибо.

+0

означает, что вы хотите сделать? –

+0

См. Мой отредактированный вопрос, я действительно хочу получить изображение оригинального размера, когда пользователь нажимает на любое уменьшенное изображение. –

+0

Не сохраняете ли вы все изображения внутри массива. Что вы подразумеваете, не имея возможности получить исходный образ? – KrishnaCA

ответ

2

Чтобы загрузить уменьшенное изображение.

Получил решение после выполнения слишком много материала, возможно, это может помочь другим. Ниже приведены шаги для этого.

Шаг 1: Объявите объект PHFetchResult

var Galleryimages: PHFetchResult<PHAsset>! 

Шаг 2: получить результаты из галереи, используя код ниже:

func grabPhotos(){ 

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

}

Шаг 3: Показывать миниатюры в пользовательском интерфейсе (coll ectionview/Tableview) с использованием кода ниже:

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 
} 

Шаг 4: И, наконец, получить полный размер изображения, используя код, приведенный ниже.

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

Вы изменяете размер изображений, когда вы получаете от PHAsset. Таким образом, использование

targetsize : PHImageManagerMaximumSize 

От этого U можно получить исходное изображение с его первоначальным размером. и для вашего коллективного просмотра вы можете сделать эскиз из него и отобразить изображения. Поэтому, когда пользователь нажимает на миниатюру, теперь вы можете показать исходное изображение

Пожалуйста, используйте autoreleasepool для управления памятью.

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

Вы правы в использовании параметра 'PHImageManagerMaximumSize' в качестве параметра. Тем не менее, не стоит загружать полноразмерный образ только для миниатюры. Вам лучше запросить изображение полного размера только при нажатии на миниатюру изображения и необходимости отображения полноразмерного изображения. – Abizern

+0

@JeckyModi Если я использую PHImageManagerMaximumSize как targetize, мое приложение выйдет из строя из-за давления в памяти. Это я использовал 200 х 200 в качестве целевого размера, чтобы избежать краха. Можете ли вы объяснить полный ответ в своем ответе? –

+0

@SumeetPurohit вы можете использовать autoreleasepool в соответствии с ответом http://stackoverflow.com/questions/33274791/high-memory-usage-looping-through-phassets-and-calling-requestimageforasset Пожалуйста, см. Ответ, как вы хотите –