1. 程式人生 > >圖片所佔記憶體

圖片所佔記憶體

1、圖片記憶體大小跟佔用空間大小有什麼關係?
佔用空間的大小不是圖片佔用記憶體的大小。佔用空間在磁碟上佔用的空間記憶體大小載入到記憶體中佔用的記憶體大小。兩個只是單位是一樣的,本質不是一個概念。
2、一張圖片到底佔用多少記憶體呢?
圖片佔用記憶體的計算公式:圖片高度 * 圖片寬度 * 一個畫素佔用的記憶體大小

儲存不同的色彩模式需要不同的記憶體,具體如下:
圖片型別 | 每畫素多少位元組
1 位元 資料圖(Line art) | 每畫素1/8位元組,也是一個位元。
8 位元灰度(Grayscale) | 每畫素1位元組。
16 位元灰度(Grayscale) | 每畫素2位元組。
24 位元 RGB | 每畫素3位元組,這是圖片中最常用的,如JPG格式。
32 位元 印刷色彩模式(CMYK) | 每畫素4位元組
48 位元 RGB | 每畫素6位元組

例如在32 位元 印刷色彩模式(CMYK)下,有一張圖片時 800 * 800 的,圖片佔用空間大小是 100KB。
則所佔記憶體:800 * 800 * 4 byte = 2500KB = 2.44M

1024kb = 1M
1024byte = 1kb
8bit = 1byte

如iPhone 6 上裝置解析度大小的RGB型別圖片佔用記憶體多少?
由於iPhone 6的設計解析度是750x1334,計算所有畫素點 = 750X1334X3 。
圖片佔用記憶體大小 = (750X1334X3) / (1024X1024) , 也就是 2.86M.
一張6x4寸的圖片在150dpi裝置上,佔用多少記憶體?
首先是計算畫素點, 畫素點 = (6 x 150) x(4 x 150) = 540,000畫素
如果圖片是RGB型別,則佔用記憶體為(540,000 x 3)/(1024 x 1024) = 1.545M。

–擴充套件–
iOS圖片問題
1、SDWebImage載入網路圖片過大/載入本地高清大圖導致記憶體溢位的解決辦法在 didReceiveMemoryWarning方法中釋放SDImage的快取

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
    [[SDWebImageManager sharedManager] cancelAll];
    [[SDImageCache sharedImageCache] clearDisk];
}

2、如果載入的是專案本地的大圖導致的記憶體溢位,解決辦法如下:
建議使用該方法獲取圖片

NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"xds"ofType:@"png"];
UIImage *image = [[UIImage alloc] initWithContentsOfFile:imagePath];
而不要使用下面的方法,圖片過大容易造成記憶體溢位
UIImage *image = [UIImage imageNamed:@"xds.png"];

3、給UIImage 寫一個類目. 類目中新增以下方法按照你需要的大小重繪UIImage, 實現圖片壓縮

-(UIImage*)scaleToSize:(CGSize)size
{
    // 建立一個bitmap的context
    // 並把它設定成為當前正在使用的context
    UIGraphicsBeginImageContext(size);
    // 繪製改變大小的圖片
    [self drawInRect:CGRectMake(0, 0, size.width, size.height)];
    // 從當前context中建立一個改變大小後的圖片
    UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();
    // 使當前的context出堆疊
    UIGraphicsEndImageContext();
    // 返回新的改變大小後的圖片
    return scaledImage;
}