получить PHAsset из UIImagePickerController

Я пытаюсь получить PHAsset из UIImagePickerController и использую следующий код:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

     //   NSURL *imageURL = [info valueForKey:UIImagePickerControllerReferenceURL];
        PHAsset *phAsset = [info valueForKey:UIImagePickerControllerPHAsset];
        if (phAsset) {
            [assetsArr addObject:phAsset];
            [galleryArr addObject:[info valueForKey:UIImagePickerControllerOriginalImage]];
        }

        dispatch_async(dispatch_get_main_queue(), ^(void) {
            [self.galleryCollectionView reloadData];
            [picker dismissViewControllerAnimated:YES completion:nil];
        });
    });


}

Если тип источника UIImagePickerControllerSourceTypePhotoLibrary, то я могу получить PHAsset по приведенному выше коду. Но если тип источника UIImagePickerControllerSourceTypeCamera, то PHAsset равен нулю.

Как я могу получить PHAsset в этом случае?


person Jagdeep Singh    schedule 07.09.2018    source источник


Ответы (2)


Если UIImagePickerControllerReferenceURL имеет какое-то значение, вы можете получить актив, используя следующий код:

PHFetchResult<PHAsset *> *result = [PHAsset fetchAssetsWithALAssetURLs:[NSArray arrayWithObject:imageURL] options:nil];

Он может иметь более одного актива, выбранного в соответствии с вашими требованиями.

person Manish Punia    schedule 11.09.2018

если вы получаете изображение с фотографии, вы можете получить исходное изображение с помощью Info Dictionary.

затем сохраните изображение в альбоме

и получите объект PHAsset.

код был показан ниже:

  /// Save image to album.
  static func saveImageToAlbum(image: UIImage, completion: ( (Bool, PHAsset?) -> Void )? ) {
  let status = PHPhotoLibrary.authorizationStatus()
  
  if status == .denied || status == .restricted {
      completion?(false, nil)
      return
  }
  
  var placeholderAsset: PHObjectPlaceholder? = nil
  PHPhotoLibrary.shared().performChanges({
      let newAssetRequest = PHAssetChangeRequest.creationRequestForAsset(from: image)
      placeholderAsset = newAssetRequest.placeholderForCreatedAsset
  }) { (suc, error) in
      DispatchQueue.main.async {
          if suc {
              let asset = self.getAsset(from: placeholderAsset?.localIdentifier)
              completion?(suc, asset)
          } else {
              completion?(false, nil)
          }
      }
  }
}

  private static func getAsset(from localIdentifier: String?) -> PHAsset? {
  guard let id = localIdentifier else {
      return nil
  }
  let result = PHAsset.fetchAssets(withLocalIdentifiers: [id], options: nil)
  if result.count > 0{
      return result[0]
  }
  return nil

}

person Guanghui Liao    schedule 03.08.2021