如何获取 PHAsset 的文件大小?

Posted

技术标签:

【中文标题】如何获取 PHAsset 的文件大小?【英文标题】:How to get file size of PHAsset? 【发布时间】:2015-11-20 07:25:49 【问题描述】:

假设有一个 PHAsset 表示图像。如何获取图片的文件大小?

我看到的唯一方法是使用valueForKey: 和私有ALAssetURL 密钥,并检索ALAssetRepresentation 的大小,但苹果可以拒绝这样的应用程序。

【问题讨论】:

您可以在这里找到可能的解决方案:***.com/a/38059090/2618955 【参考方案1】:

Swift 4/5 解决方案

扩展

extension PHAsset 
    var fileSize: Float 
        get 
            let resource = PHAssetResource.assetResources(for: self)
            let imageSizeByte = resource.first?.value(forKey: "fileSize") as! Float
            let imageSizeMB = imageSizeByte / (1024.0*1024.0)
            return imageSizeMB
        
    

功能

func getImageFileSize(from asset: PHAsset) -> Float
    let resource = PHAssetResource.assetResources(for: asset)
    let imageSizeByte = resource.first?.value(forKey: "fileSize") as! Float
    let imageSizeMB = imageSizeByte / (1024.0*1024.0)
    return imageSizeMB

【讨论】:

请注意,如果您在照片应用中修改了您的照片或视频,您将获得多个资源,包括原始媒体和修改后的媒体,以及调整数据。所以你应该判断PHAssetResource的类型,而不是使用第一个。 慢动作视频也有多种资源。【参考方案2】:

您可以从 PHAsset 创建 ALAsset,而无需使用此处所述的任何私有函数: How to get an ALAsset URL from a PHAsset?

但是,在 iCloud 照片库的上下文中获取文件大小是有问题的。对于不在设备上的照片,您可能会得到“0”值或设备上版本的大小,这在很多情况下都不是原始照片。

【讨论】:

您要求提供非私有解决方案。上面链接中所述的解决方案仅使用公共 API。 API 是公开的,但您构建资产 URL 的方式依赖于未记录的假设。这就是为什么我还没有接受这个答案。

以上是关于如何获取 PHAsset 的文件大小?的主要内容,如果未能解决你的问题,请参考以下文章

如何在swift3中从库的PHAsset中获取图像文件名

获取 PHAsset 的本地文件路径

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

如何检索 PHAsset 的元数据?

如何从视频 URL 获取视频的 PHAsset?

从 PHAsset swift 5 IOS13 获取文件名