如何获取PHAsset的文件大小?

5
假设有一个代表图像的PHAsset。如何获取图像的文件大小?
我唯一看到的方法是使用私有的ALAssetURL键的valueForKey:,并检索ALAssetRepresentation的大小,但苹果可能会拒绝这样的应用程序。

你可以在这里找到可能的解决方案:http://stackoverflow.com/a/38059090/2618955 - Sergey Alpeev
2个回答

13

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
}

1
请注意,如果您在“照片”应用程序中修改了照片或视频,则会获得多个资源,包括原始媒体、修改后的媒体和调整数据。因此,您应该判断PHAssetResource的类型,而不是使用第一个资源。 - Franz Wang
1
慢动作视频也有多个资源。 - Franz Wang

0

您可以按照此处所述的方式,无需使用任何私有函数,从PHAsset创建ALAsset: 如何从PHAsset获取ALAsset URL?

然而,在iCloud照片库的上下文中,获取文件大小是有问题的。对于不在设备上的照片,您可能会得到一个值为“0”或者是设备上版本的大小,而这并不是每种情况下的原始大小。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接