如何从 PHAsset 获取原始图像和媒体类型?

Posted

技术标签:

【中文标题】如何从 PHAsset 获取原始图像和媒体类型?【英文标题】:How to get Original Image and media type from PHAsset? 【发布时间】:2016-02-08 07:05:22 【问题描述】:

我的**GMImagePickerController** 从照片应用返回所选图像的列表。

代码如下。

  - (void)assetsPickerController:(GMImagePickerController *)picker  didFinishPickingAssets:(NSArray *)assetArray
     
        NSLog(@"%@",assetArray);
        NSLog(@"GMImagePicker: User ended picking assets. Number of selected items is: %lu", (unsigned long)assetArray.count);
  

assetArray 返回结果是这样的,我从照片应用中选择了 3 张图片

 (
"<PHAsset: 0x7fa39e02e840> 1AEEF04A-F8AB-4019-AAB5- 2875CFD8F8E3/L0/001 mediaType=1/0, sourceType=1, (425x425), creationDate=2016-02-03 13:53:17 +0000, location=0, hidden=0, favorite=0 ",
"<PHAsset: 0x7fa39e02c840> 50489C13-55D0-4518-B290-B01B99D66996/L0/001 mediaType=1/0, sourceType=1, (425x335), creationDate=2016-02-03 13:53:08 +0000, location=0, hidden=0, favorite=0 ",
"<PHAsset: 0x7fa39e02c750> D0A466B2-9CF2-4FD9-A12F-07921A1D0E8F/L0/001 mediaType=1/0, sourceType=1, (425x365), creationDate=2016-02-03 13:53:04 +0000, location=0, hidden=0, favorite=0 "
 )

现在的问题是我想从上面的结果中获取OriginalImagemediaType 以将图像存储到文档目录中。 请帮我解决这个问题。

【问题讨论】:

我认为你使用了错误的库,我检查了返回原始图像的github.com/guillermomuntaner/GMImagePicker 查看***.com/questions/32687403/… 将资产传递给资产管理器并检索信息。 查看***.com/questions/31670929/… 如何删除PHAsset中的图片? 【参考方案1】:

要检查媒体类型,您可以使用 phasset 的以下属性

if asset.mediaType == .image
 //do anything for image asset

else if asset.mediaType == .video
 //do anything for video asset

else if asset.mediaType == .audio
 //do anything for audio asset

要从 PHAsset 获取原始图像,您可以执行以下操作:

let requestImageOption = PHImageRequestOptions()
requestImageOption.deliveryMode = PHImageRequestOptionsDeliveryMode.highQualityFormat

let manager = PHImageManager.default()
manager.requestImage(for: asset, targetSize: PHImageManagerMaximumSize, contentMode:PHImageContentMode.default, options: requestImageOption)  (image:UIImage?, _) in
        // process the original image
 

【讨论】:

【参考方案2】:
 NSLog(@"====%@====",assetArray);

for(int i=0;i<assetArray.count;i++)

    self.requestOptions = [[PHImageRequestOptions alloc] init];
    self.requestOptions.resizeMode   = PHImageRequestOptionsResizeModeExact;
    self.requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;

    // this one is key
    self.requestOptions.synchronous = true;

    //  self.assets = [NSMutableArray arrayWithArray:assets];
    PHImageManager *manager = [PHImageManager defaultManager];
    Albumimages = [NSMutableArray arrayWithCapacity:[assetArray count]];

    // assets contains PHAsset objects.
    __block UIImage *ima;

    for (PHAsset *asset in assetArray) 
        // Do something with the asset

        [manager requestImageForAsset:asset
                           targetSize:PHImageManagerMaximumSize
                          contentMode:PHImageContentModeDefault
                              options:self.requestOptions
                        resultHandler:^void(UIImage *image, NSDictionary *info) 
                         //retrive all  images   
                     ima = image;


                        ];
    


使用 PHImageManager 我们可以获得完整的原始图像。

【讨论】:

【参考方案3】:

您可以获取原始文件的 URL 并检查内容。有了这个,您可以获得 EXIF 数据和所有这些东西:

  /* Get the URL of the source image in the Asset */
  func getAssetURL(asset: PHAsset, completion: @escaping (_ url: URL?) -> Void) 
      let options = PHContentEditingInputRequestOptions()
      options.isNetworkAccessAllowed = false
      asset.requestContentEditingInput(with: options, completionHandler:  (contentEditingInput, dictionary) in
          completion(contentEditingInput?.fullSizeImageURL)
      )
  

【讨论】:

以上是关于如何从 PHAsset 获取原始图像和媒体类型?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 PHAsset 获取图像 URL?是不是可以使用 PHAsset URL 将图像保存到文档目录?

照片框架 - 如何从 PHAsset 获取图像的 CLLocation?

如何从 PHAsset for iOS 13 获取图像 url

如何将 PHAsset 存储到核心数据中

如何获取 PHAsset 的原始(EXIF?)创建日期/时间?

如何使用 UIDocumentPickerViewController 获取原始文件名?