簡體   English   中英

從 UIImagePickerController 獲取 PHAsset

[英]get PHAsset From UIImagePickerController

我想從 UIImagePickerController 獲取 PHAsset 並使用以下代碼:

- (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?

如果UIImagePickerControllerReferenceURL具有某些值,則可以使用以下代碼獲取資產:

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

根據您的要求,它可能有多個資產可供選擇。

如果您通過拍照獲得圖像,則可以通過信息詞典獲得原始圖像

然后將圖像保存在相冊中

並獲取 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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM