首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从UIImagePickerController获取PHAsset

从UIImagePickerController获取PHAsset
EN

Stack Overflow用户
提问于 2018-09-08 01:28:49
回答 2查看 917关注 0票数 1

我正在尝试从UIImagePickerController获取PHAsset,并使用以下代码:

代码语言:javascript
复制
- (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?

EN

回答 2

Stack Overflow用户

发布于 2018-09-11 13:59:07

如果UIImagePickerControllerReferenceURL有一些值,那么您可以使用以下代码获取资产:

代码语言:javascript
复制
PHFetchResult<PHAsset *> *result = [PHAsset fetchAssetsWithALAssetURLs:[NSArray arrayWithObject:imageURL] options:nil];

它可以根据您的需求选择多个资产。

票数 0
EN

Stack Overflow用户

发布于 2021-08-03 09:55:12

如果你通过拍照得到图像,你可以通过Info Dictionary获得原始图像

然后将图像保存在相册中

并获取PHAsset对象。

代码如下所示:

代码语言:javascript
复制
  /// 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

}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52227162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档