圖片所佔記憶體
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;
}