Получить уменьшенные изображения в списке и полноразмерное изображение при нажатии на элемент списка

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

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.

Спасибо.

2 ответа

Решение

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

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

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

var Galleryimages: PHFetchResult<PHAsset>!

Шаг 2: Получить результаты из галереи, используя следующий код:

func grabPhotos(){

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

}

Шаг 3: Показать миниатюры изображений в вашем пользовательском интерфейсе (collectionview/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
  }
}

Вы изменяете размеры изображений, когда вы выбираете из 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
}
Другие вопросы по тегам