關於圖片在記憶體中的大小(k或者M)

Crazy巴旦木發表於2019-01-16

最近在做一個上傳圖片的功能,但是清晰度不能太低,圖片也不能太大,但是計算這塊兒就出現了難題。
OSS對尺寸大小有限制,不能超過4096。 我們從相簿選擇好圖片,先判斷大小,查了很多資料發現是不對的,計算出來跟在mac或者手機裡是不一樣的,偏很大,比如這種方法:

image.size.width * image.size*height * 4 / 1024 /1024 = 0.5M
我計算出來比實際大了3倍
複製程式碼

還有這種方法:

NSData *data = UIImageJPEGRepresentation(image, 1);
(unsigned long)data.length/1024/1024 = 0.5M
也是不行,大小跟上面差不多
複製程式碼

找到一個大小計算正確的:

CGFloat imageDataSize = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil].fileSize/1024;//計算出來是k
filePath是圖片的路徑,比如從照片庫拿到的info[UIImagePickerControllerImageURL]的路徑,或者從沙盒拿到的路徑都可以計算。
複製程式碼

又碰見一個問題,如果解析度過大,我們要對圖片進行縮放,縮放完成之後大小會改變,所以我們還要對圖片進行一次計算,但是現在image在記憶體中,沒有路徑,我們怎麼計算?既然從路徑拿到的大小是正確的,那麼我們就給它一個路徑,存到臨時資料夾,計算完大小再刪除。

//計算image大小
+(CGFloat)getImageTrueSize:(UIImage *)image{
    NSData *imgData = UIImageJPEGRepresentation(image, 1.0);
    NSFileManager *manager = [NSFileManager defaultManager];
    NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.jpeg",@"123"]; //這裡的名字可以隨便起,我們計算完就給刪掉了
    if(![manager fileExistsAtPath:filePath]){
        [manager createFileAtPath:filePath contents:imgData attributes:nil];
    }else{
        [imgData writeToFile:filePath atomically:YES];
    }
    CGFloat imageDataSize = [manager attributesOfItemAtPath:filePath error:nil].fileSize/1024;
    [manager removeItemAtPath:filePath error:nil];
    return imageDataSize;
}
複製程式碼

相關文章