美文网首页Android开发Android开发Android技术知识
Android:一张图片占用多少内存

Android:一张图片占用多少内存

作者: 猪_队友 | 来源:发表于2018-07-01 10:45 被阅读341次

    我们在开发Android应用的时候,经常会遇到OOM,加载图片过大,更是在OOM里面占有很大的比重,

    • 那么为什么会出现OOM?
    • 为啥图片过大就会OOM?
    • 图片的大小就是内存里的大小吗?

    首先第一个问题:为什么会出现OOM?

    答:为了整个系统的内存控制需要,Android系统为每一个应用程序都设置一个最大内存。超过这个内存数,那么就会OOM 内存溢出。当然不同手机这个最大内存的值不同。所以我们尽量不去占用过多内存。造成OOM的原因很多大家自行百度,这不是本文的重点。

    第二个问题:为啥图片过大就会OOM?

    因为图片的加载也是需要内存分配的,如果应用最大内存为32M,一个图片一下子需要50M的内存,那就肯定会溢出OOM。也有一种情况是 要一次加载很多图片,每一个可能不大,但是加起来的数量也是很恐怖。所以也有可能造成OOM。

    第三个问题:图片的大小就是内存里的大小吗?

    相信很多人,都有同样的而困惑,比如我有一张图片1080*720,图片的大小是200K(图片占用空间)

    • 图片占用空间 =》 磁盘上图片占用的空间大小
    • 图片内存大小 =》 加载到内存中图片占用的内存大小
      单位一样,完全不是一个概念

    计算占用内存大小的公式:

    图片宽 * 图片高 * 一个像素占用内存大小

    一个像素占用内存像素大小和色值编码格式有关系,比如RGB就是3byte,ARGB就是4byte。我们这里就用ARGB来计算。

    所以上面的图片占用内存就是:

    1080*720*4byte = 3037.5K = 2.97M
    

    我们可以看出图片的宽高,和编码格式会影响图片占用内存的大小。从这个公式里看不出还有别的因素~~这应该就是准确的内存大小了吧。

    答案是不对的~

    图片所在目录对内存也有影响,而且很多。

    image.png

    不懂屏幕适配知识的可以先看一下我之前写的这篇文章Android 屏幕适配

    假设:我们在xhdpi 目录下放了这个图片

    屏幕密度是2倍的手机上:

    1080*720*4byte = 3037.5K = 2.97M
    

    屏幕密度是3倍的手机上:

    1080*1.5 *720*1.5 *4byte = 6827.6K =6.67M
    

    所以在计算图片占用内存大小的时候,要考虑图片所在的目录,和设备密度。
    其实本质上还是宽和高的像素数量。Android会把图片进行拉伸和收缩。已达到显示目的。

    后记:

    学会了如何计算图片占用内存大小,之后要考虑的是如何优化图片占用内存了。
    平时可以多使用.9 png 来避免大图。
    如果非要加载大图或者巨图,那么也只能按区域加载,每次加载到内存的都必须是不超过限制的,这个之后的文章会给出回答。

    相关文章

      网友评论

      • 叮宕:1.随便用手机找张照片
        2.python 用PIL.Image.open打开
        3.用numpy.array转成数组
        4.用size看下就知道多恐怖
        5.你可以转成列表,然后每个点用plot来画下,我保证你死机
        猪_队友:可怕
      • javaBoy_hw:文中说“计算图片占用内存大小的时候,要考虑图片所在的目录,和设备密度。”,从网络上加载的图片,如何确定图片所在目录?例如:我请求一个网络图片后,它是在hdpi?还是xhdpi?
        猪_队友:仔细看文章~~
      • javaBoy_hw:你说的“屏幕密度是2倍的手机”具体是指多少dpi的?屏幕密度一般不都是多少dpi嘛?
        猪_队友:我有一篇屏幕适配的文章 可以了解一下
      • 码无止境:虽然文章简短,但写得不错,继续加油:+1:

      本文标题:Android:一张图片占用多少内存

      本文链接:https://www.haomeiwen.com/subject/szzayftx.html