Android 中图片的内存大小计算

一、计算机是如何表示图片的

  1. 首先我们先了解一下计算机中图片格式, 百度一下你会发现图片有如下格式:
    bmp,jpg,png,tif,gif,pcx,tga,exif,fpx,svg,psd,cdr,pcd,dxf,ufo,eps,ai,raw,WMF,webp等。
    那么实际中,我们常用的格式无非就是 jpg,png,bmp,三种, 下面的也是三种格式的概念


    image.png
  2. 另外我们不得不说webp这种格式了, WebP 是由 Google于2010年提出,拥有一种优秀的图像数据压缩算法,能带来更小的图片体积,而且拥有肉眼识别无差异的图像质量;同时具备了无损和有损的压缩模式、Alpha 透明以及动画的特性,在 JPEG 和 PNG 上的转化效果都相当优秀、稳定和统一。
    之前做过一个测试,对比 PNG 原图、PNG 无损压缩、PNG 转 WebP(无损)、PNG 转 WebP(有损)的压缩效果:
    image.png

    更多测试查看 WebP 示例 (PNG 转 WebP)(请用 Chrome 浏览器打开)
  3. 虽然webp 优势这么好,但是在国内使用其实并不多,国外可使用多一些,

二、图片色彩

我们都知道颜色经常用ARGB来表示,A表示Alpha,即透明度;R表示red,即红色;G表示green,即绿色;B表示blue,即蓝色。Bitmap的色彩也是用ARGB来表示的

三、 在Android 中图片内存计算的方式

我们都知道在Android 中,图片最终是一bitmap 的方式表示,那么Android中,一张图片的内存大小改怎么计算呢,首先我们了解几个概念

  1. 图片的占用内存的计算方式, 图片长度图片宽度单位像素占用的字节数,
    图片的长度和宽度我们都知道是图片的分辨率例如 图片的分辨率是1920*1080 那么长度就是1920 宽度就是1080 , 单位像素占用的字节数,也就是我们所说的位深,(这个后面会讲)
  2. Bitmap.Config
    Bitmap.Config中有Bitmap.Config.ALPHA_8、Bitmap.Config.RGB_565、Bitmap.Config.ARGB_4444、Bitmap.Config.ARGB_8888有四个枚举变量。
    Bitmap.Config.ALPHA_8表示:每个像素占8位,没有色彩,只有透明度A-8,共8位。
    Bitmap.Config.ARGB_4444表示:每个像素占16位,A-4,R-4,G-4,B-4,共4+4+4+4=16位。
    Bitmap.Config.RGB_565表示:每个像素占16位,没有透明度,R-5,G-6,B-5,共5+6+5=16位。
    Bitmap.Config.ARGB_8888表示:每个像素占32位,A-8,R-8,G-8,B-8,共8+8+8+8=32位。
    位数越高,那么可存储的颜色信息越多,图像也就越逼真。
  3. Bitmap位深的计算
    ARGB_8888是最占内存的,因为一个像素占32位,8位=1字节,所以一个像素占4字节的内存。ARGB_4444的一个像素占2个字节。RGB_565的一个像素也是占两个字节。ALPHA_8的一个像素只占一个字节。

弄清了这几个概念,那么我们就可以计算不同图片格式的的内存占用大小,假设有一张480x800的图片
四个格式下所占的内存如下


image.png

四、图片占用空间

那么在图片占用空间上,按照上面的理解,是不是说图片分辨率一样,所占的内存空间就是一样呢?
其实,如果要理解这个问题,我们其实要了解图片占用的硬盘空间和内存空间两个概念

  1. 内存占用空间
    图片占用空间的的计算方式: 图片长度 * 图片宽度图片位深
    图片长款由图片的分辨率决定,而图片的位深由不同的图片格式决定,Android中默认位图深是.ARGB_8888
    也就是位深是24位, 一张 400
    800 24位深的图片,我们就可以计算出在Android中消耗的内存是:
    800 * 400 * 24 = 9,216,000bit = 1536000B = 1.46M

  2. 硬盘空间
    硬盘空间其实也是就是我们所说的图片保存后占用的大小,也就是在图片在我们硬盘上占用的大小,在我们图片右键属性,可以查到,


    图片一属性

    图片二属性

    图片一的大小

    图片二的大小

那么这个是怎么得来的呢? 按照内存大 计算方式,分辨率一样,占用的大小应该是一样的,为什么图片一和图片二 同样都是1920 * 1080 的图片,占用硬盘空间差异这么大, 图片一占用到1.25M 图片二占用268K,这是为什么呢,影响愿意有二.

  1. 我们就要想到不同图片格式为什么存在的问题, 同样的图片,不同的格式 所占的空间大小不一样, 这就是因为不同格式压缩算法不一样的原因 ,我们也可以这样理解,我们不同的压缩方式和7-zip压缩,同样的大小文件,占用的空间是不一样的.
  2. 图片的格式一样,分辨率也一样,为什么我们的图片还是有差异,其实这个是因为我们的图片的"内容" 有关,就是这张图片里面所有像素的二进制的表现值,所以我们可以知道,图片的硬盘存储空间大小,没有绝对的关系

ok,本篇文章完

参考资料

https://www.jianshu.com/p/5752eae2f27a
https://www.zhihu.com/question/27201061

你可能感兴趣的:(Android 中图片的内存大小计算)