簡體   English   中英

從 PHAsset 確定圖像 MB 大小

[英]Determine image MB size from PHAsset

我想確定通過 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

這些值中的哪一個實際上代表了它在設備上所占的數量?

將圖片通過電子郵件發送給自己並在系統上檢查尺寸后,結果證明方法 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字節。
我用其他五張圖像進行了測試,報告的兩種尺寸也非常接近。

當數據大得令人望而卻步時,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);
            }

        }];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM