获取 PHAsset 的本地文件路径

Posted

技术标签:

【中文标题】获取 PHAsset 的本地文件路径【英文标题】:Get the local file path of a PHAsset 【发布时间】:2015-02-04 17:39:35 【问题描述】:

我希望我的用户能够在 Instagram 上分享一张照片,我需要获取该照片的本地文件目录。

但是,我将图像作为 PHAsset 获取(而不是 ALAsset,所有其他答案似乎都涵盖了这个主题)。

查看 PHAsset 文档,我没有看到“本地目录”变量。

您知道如何使用新的 ios8 Photo 框架从用户相机胶卷中获取照片的路径吗?

这是我在用户相册中加载最后一张图片的代码

public func loadLastPhotoIntoGalleryIcon()

    if(phphotoLibrary.authorizationStatus() != PHAuthorizationStatus.Authorized)
    
        return
    
    var fetchOptions:PHFetchOptions = PHFetchOptions()
    fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
    var fetchResult:PHFetchResult = PHAsset.fetchAssetsWithMediaType(PHAssetMediaType.Image, options: fetchOptions)

    var lastAsset:PHAsset = fetchResult.firstObject as PHAsset

    var options:PHImageRequestOptions = PHImageRequestOptions()
    options.version = PHImageRequestOptionsVersion.Current
    PHImageManager.defaultManager().requestImageForAsset(lastAsset, targetSize: _view.getGalleryIconSize(), contentMode: PHImageContentMode.AspectFill, options: options)
    
        (result, objects) -> Void in
        self._view.setGalleryIcon(result)
    


【问题讨论】:

【参考方案1】:

使用内容编辑输入:

asset.requestContentEditingInput(with: PHContentEditingInputRequestOptions())  (input, _) in
        let url = input.fullSizeImageURL

确保资产为PHAssetMediaType.Image,否则在解压可选组件时可能会崩溃。

【讨论】:

input.fullSizeImageURL 无法在设备上加载图像,尽管它正在模拟器上运行【参考方案2】:
func getImagesFromAsset(anAsset: PHAsset) 
    PHImageManager.default().requestImage(for: anAsset, targetSize: CGSize(width: 600, height: 600), contentMode: .aspectFill, options: nil, resultHandler:  (image, info) in
        //resultHandler have info ([AnyHashable: Any])
        print(info!["PHImageFileURLKey"])
        if let img = image 
            self.imgv.image = img
        
    )

这可能会有所帮助 将此粘贴到您的 CellForRowAt 方法中并在参数中传递 PHAsset。

【讨论】:

但由于苹果隐私政策,您将无法访问目录【参考方案3】:
PHAsset *asset = YOUR_ASSET;

PHImageManager *manager = [PHImageManager defaultManager];
PHImageRequestOptions *options = [PHImageRequestOptions new];
options.synchronous = YES;
options.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
options.resizeMode = PHImageRequestOptionsResizeModeNone;
options.networkAccessAllowed = NO;

[manager requestImageForAsset:YOUR_ASSET targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeDefault options:options resultHandler:^(UIImage *resultImage, NSDictionary *info)

    NSURL *filePath = [info valueForKeyPath:@"PHImageFileURLKey"]

];

【讨论】:

【参考方案4】:

资产=PHAsset *资产

[asset requestContentEditingInputWithOptions:[PHContentEditingInputRequestOptions new] completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info) 
   NSURL *imageURL = contentEditingInput.fullSizeImageURL;
];

确保您的 PHAsset 应该是图像类型 检查这个 PHAssetMediaType.Image 应该是真的

【讨论】:

【参考方案5】:

是的,您必须将 PHAsset 转换为 ALAsset,然后您才能从 ALAsset 中获取 url。 像这样的东西: PHImageManager.defaultManager().requestAVAssetForVideo....

【讨论】:

【参考方案6】:

请求资产信息以开始内容编辑会话。

- (PHContentEditingInputRequestID)requestContentEditingInputWithOptions:(PHContentEditingInputRequestOptions *)options 
                                                      completionHandler:(void (^)(PHContentEditingInput *contentEditingInput, NSDictionary *info))completionHandler;

包含全尺寸图像数据的文件的 URL。

@property(readonly, copy) NSURL *fullSizeImageURL;

【讨论】:

以上是关于获取 PHAsset 的本地文件路径的主要内容,如果未能解决你的问题,请参考以下文章

如何检索 PHAsset 的元数据?

swift两种获取相册资源PHAsset的路径的方法(绝对路径)

在获取 PHAsset 路径时展开可选值时意外发现 nil [重复]

如何获取图像的路径?

如何上传 PHAsset(仅限视频和图像)?

怎么获取一个文件夹的路径,本地的路径