【问题标题】:Determine image MB size from PHAsset从 PHAsset 确定图像 MB 大小
【发布时间】: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

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

【问题讨论】:

    标签: ios swift


    【解决方案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 字节。
    我用其他五张图片进行了测试,报告的两种尺寸非常接近。

    【讨论】:

    【解决方案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。请编辑。谢谢!
    猜你喜欢
    • 2015-11-27
    • 1970-01-01
    • 2019-05-27
    • 2021-02-10
    • 2014-03-29
    • 2010-12-06
    • 2023-03-22
    • 1970-01-01
    • 2013-01-14
    相关资源
    最近更新 更多