• Android中图片占用内存的计算


    Android中图片占用内存的计算

    原文链接 http://blog.sina.com.cn/s/blog_4e60b09d01016133.html

     
    在Android开发中,我现在发现很多人还不会对图片占用内存进行很好的计算。因此撰写该博文来做介绍,期望达到抛砖引玉的作用。
      Android中一张图片(BitMap)占用的内存主要和以下几个因数有关:图片长度,图片宽度,单位像素占用的字节数。
    一张图片(BitMap)占用的内存=图片长度*图片宽度*单位像素占用的字节数
    图片长度和图片宽度的单位是像素。
    图片(BitMap)占用的内存应该和屏幕密度(Density)无关,虽然我暂时还拿不出直接证据。
       创建一个BitMap时,其单位像素占用的字节数由其参数BitmapFactory.OptionsinPreferredConfig变量决定。
    inPreferredConfig为Bitmap.Config类型,
    Bitmap.Config类是个枚举类型,它可以为以下值
    Enum Values
    Bitmap.Config  ALPHA_8  Each pixel is stored as a single translucency (alpha) channel. 
    This is very useful to efficiently store masks for instance. No color information is stored. With this configuration, each pixel requires 1 byte of memory.
    此时图片只有alpha值,没有RGB值,一个像素占用一个字节
    Bitmap.Config  ARGB_4444  This field is deprecated. Because of the poor quality of this configuration, it is advised to use ARGB_8888instead.  
    这种格式的图片,看起来质量太差,已经不推荐使用。
    Each pixel is stored on 2 bytes. The three RGB color channels and the alpha channel (translucency) are stored with a 4 bits precision (16 possible values.) This configuration is mostly useful if the application needs to store translucency information but also needs to save memory. It is recommended to use ARGB_8888 instead of this configuration.
    一个像素占用2个字节,alpha(A)值,Red(R)值,Green(G)值,Blue(B)值各占4个bites,共16bites,即2个字节
    Bitmap.Config  ARGB_8888  Each pixel is stored on 4 bytes. Each channel (RGB and alpha for translucency) is stored with 8 bits of precision (256 possible values.) This configuration is very flexible and offers the best quality. It should be used whenever possible
    一个像素占用4个字节,alpha(A)值,Red(R)值,Green(G)值,Blue(B)值各占8个bites,共32bites,即4个字节
    这是一种高质量的图片格式,电脑上普通采用的格式。它也是Android手机上一个BitMap的默认格式。
    Bitmap.Config  RGB_565  Each pixel is stored on 2 bytes and only the RGB channels are encoded: red is stored with 5 bits of precision (32 possible values), green is stored with 6 bits of precision (64 possible values) and blue is stored with 5 bits of precision. This configuration can produce slight visual artifacts depending on the configuration of the source. For instance, without dithering, the result might show a greenish tint. To get better results dithering should be applied. This configuration may be useful when using opaque bitmaps that do not require high color fidelity.
    一个像素占用2个字节,没有alpha(A)值,即不支持透明和半透明,Red(R)值占5个bites ,Green(G)值占6个bites  ,Blue(B)值占5个bites,共16bites,即2个字节.对于没有透明和半透明颜色的图片来说,该格式的图片能够达到比较的呈现效果,相对于ARGB_8888来说也能减少一半的内存开销。因此它是一个不错的选择。另外我们通过android.content.res.Resources来取得一个张图片时,它也是以该格式来构建BitMap的
    Android4.0开始,该选项无效。即使设置为该值,系统任然会采用 ARGB_8888来构造图片
    :ARGB指的是一种色彩模式,里面A代表Alpha,R表示redG表示greenB表示blue,其实所有的可见色都是红绿蓝组成的,所以红绿蓝又称为三原色。
    A  R  G  B
    透明度 红色 绿色 蓝色
    简单点说

     图片格式(Bitmap.Config

     占用内存的计算方向

     一张100*100的图片占用内存的大小

     ALPHA_8

     图片长度*图片宽度

     100*100=10000字节

     ARGB_4444

     图片长度*图片宽度*2

     100*100*2=20000字节

     ARGB_8888

     图片长度*图片宽度*4

     100*100*4=40000字节

     RGB_565 

     图片长度*图片宽度*2

     100*100*2=20000字节

     
    另外,需要注意这里的图片占用内存是指在Navtive中占用的内存,当然BitMap使用的绝大多数内存就是该内存。
    因为我们可以简单的认为它就是BitMap所占用的内存。
      Bitmap对象在不使用时,我们应该先调用recycle(),然后才它设置为null.
    虽然Bitmap在被回收时可以通过BitmapFinalizer来回收内存。但是调用recycle()是一个良好的习惯
    在Android4.0之前,Bitmap的内存是分配在Native堆中,调用recycle()可以立即释放Native内存。
    从Android4.0开始,Bitmap的内存就是分配在dalvik堆中,即JAVA堆中的,调用recycle()并不能立即释放Native内存。但是调用recycle()也是一个良好的习惯。
     
    通过dumpsys meminfo命令可以查看一个进程的内存使用情况,
    当然也可以通过它来观察我们创建或销毁一张BitMap图片内存的变化,从而推断出图片占用内存的大小。
    示例adb shell "dumpsys meminfo com.lenovo.robin"
    运行结果。
    Applications Memory Usage (kB):
    Uptime: 18696550 Realtime: 18696541
    ** MEMINFO in pid 7985 [com.lenovo.robin] **
                        native   dalvik    other    total
                size:     4828     5379      N/A    10207
           allocated:     4073     2852      N/A     6925
                free:       10     2527      N/A     2537
               (Pss):      608      317     1603     2528
      (shared dirty):     2240     1896     6056    10192
        (priv dirty):      548       36     1276     1860
     
     Objects
               Views:        0        ViewRoots:        0
         AppContexts:        0       Activities:        0
              Assets:        2    AssetManagers:        2
       Local Binders:        5    Proxy Binders:       11
    Death Recipients:        1
     OpenSSL Sockets:        0
     
     SQL
     
                   heap:        0         MEMORY_USED:        0
     PAGECACHE_OVERFLOW:        0         MALLOC_SIZE:        0
    关于内存统计的更多内容请参考《Android中如何查看内存
  • 相关阅读:
    使用RestTemplate进行服务调用的几种方式
    springmvc学习指南 之---第32篇 mybatis 嵌套的处理
    springmvc学习指南 之---第31篇 使用墨客进行测试报错
    springmvc学习指南 之---第30篇 异常的全局处理
    Effective Java 阅读笔记--之(一) 建造者模式(Builder)
    使用mybatis-generator.xml 生成PO 对象
    springmvc学习指南 之---第29篇 springmvc 返回json对象, 不想创建类的前提下
    springmvc学习指南 之---第28篇 springmvc的controller 如何解析视图view? 如何解析json,html,jsp?
    springmvc学习指南 之---第27篇 spring如何实现servlet3.0无web.xml 配置servlet对象的
    springmvc学习指南 之---第26篇 在idea中如何debug跟踪到tomcat内部代码
  • 原文地址:https://www.cnblogs.com/qingchen1984/p/4971720.html
Copyright © 2020-2023  润新知