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;
}