从 PHAsset 确定图像 MB 大小

Posted

技术标签:

【中文标题】从 PHAsset 确定图像 MB 大小【英文标题】:Determine image MB size from PHAsset 【发布时间】:2014-08-20 02:37:43 【问题描述】:

我想确定通过 PHAsset 访问的图像的内存大小。这个大小是为了让我们知道它在设备上占用了多少内存。这是什么方法?

var imageSize = Float(imageData.length)

var image = UIImage(data: imageData)
var jpegSize = UIImageJPEGRepresentation(image, 1)
var pngSize = UIImagePNGRepresentation(image)
var pixelsMultiplied = asset.pixelHeight * asset.pixelWidth

println("regular data: \(imageSize)\nJPEG Size: \(jpegSize.length)\nPNG Size: \(pngSize.length)\nPixel multiplied: \(pixelsMultiplied)")

结果:

regular data: 1576960.0
JPEG Size: 4604156
PNG Size: 14005689
Pixel multiplied: 7990272

这些值中的哪一个实际上代表了它在设备上占用的数量?

【问题讨论】:

【参考方案1】:

将图片通过电子邮件发送给自己并在系统上检查尺寸后,发现 approach ONE 最接近实际尺寸。

为了得到一个PHAsset(图像类型)的大小,我使用了以下方法:

var asset = self.fetchResults[index] as PHAsset

self.imageManager.requestImageDataForAsset(asset, options: nil)  (data:NSData!, string:String!, orientation:UIImageOrientation, object:[NSObject : AnyObject]!) -> Void in
    //transform into image
    var image = UIImage(data: data)

    //Get bytes size of image
    var imageSize = Float(data.length)

    //Transform into Megabytes
    imageSize = imageSize/(1024*1024)
 

我的 macbook 上的 Command + I 将图像大小显示为 1,575,062 字节。 我的程序中的 imageSize 显示大小为 1,576,960 字节。 我用其他五张图片进行了测试,报告的两种尺寸非常接近。

【讨论】:

我想提请您注意对这个类似答案的所有残酷评论:***.com/a/14957522/656600【参考方案2】:

当数据过大时,NSData 方法变得不稳定。您可以使用以下替代方法:

[[PHImageManager defaultManager] requestAVAssetForVideo:self.phAsset options:nil resultHandler:^(AVAsset *asset, AVAudioMix *audioMix, NSDictionary *info) 

    CGFloat rawSize = 0;

    if ([asset isKindOfClass:[AVURLAsset class]])
    
        AVURLAsset *URLAsset = (AVURLAsset *)asset;
        NSNumber *size;
        [URLAsset.URL getResourceValue:&size forKey:NSURLFileSizeKey error:nil];
        rawSize = [size floatValue] / (1024.0 * 1024.0);
    
    else if ([asset isKindOfClass:[AVComposition class]])
    
        // Asset is an AVComposition (e.g. slomo video)

        float estimatedSize = 0.0;

        NSArray *tracks = [self tracks];
        for (AVAssetTrack * track in tracks)
        
            float rate = [track estimatedDataRate] / 8.0f; // convert bits per second to bytes per second
            float seconds = CMTimeGetSeconds([track timeRange].duration);
            estimatedSize += seconds * rate;
        

        rawSize = estimatedSize;
    

    if (completionBlock)
    
        NSError *error = info[PHImageErrorKey];
        completionBlock(rawSize, error);
    

];

或者对于 ALAssets,类似这样:

        [[[ALAssetsLibrary alloc] init] assetForURL:asset.URL resultBlock:^(ALAsset *asset) 

            long long sizeBytes = [[asset defaultRepresentation] size];

            if (completionBlock)
            
                completionBlock(sizeBytes, nil);
            

         failureBlock:^(NSError *error) 

            if (completionBlock)
            
                completionBlock(0, error);
            

        ];

【讨论】:

有没有办法为图片做到这一点? 还有 AVComposition.. 在不加载所有数据的情况下仅获得文件大小是多么困难 您的答案可能是正确的,但该问题专门要求提供 Swift 代码示例,而不是 Objective-C。请编辑。谢谢!

以上是关于从 PHAsset 确定图像 MB 大小的主要内容,如果未能解决你的问题,请参考以下文章

如何为从照片框架获取的 PHAsset 添加分页?

如何在 Swift 5.2 中使用 PHAsset.fetchAssets(withLocalIdentifiers:) 从照片库中检索照片?

iOS Photokit - PHAsset pixelWidth 和 pixelHeight 与高分辨率图像不匹配

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

如何获取视频 PHAsset 磁盘文件大小?

如何获取 PHAsset 的文件大小?