Android中图片占用内存的计算

2023-05-16

原帖:http://blog.csdn.net/hudashi/article/details/7856519

在Android开发中,我现在发现很多人还不会对图片占用内存进行很好的计算。因此撰写该博文来做介绍,期望达到抛砖引玉的作用。

  Android中一张图片(BitMap)占用的内存主要和以下几个因数有关:图片长度,图片宽度,单位像素占用的字节数。
一张图片(BitMap)占用的 内存 = 图片长度*图片宽度*单位 像素占用的字节数
图片长度和 图片宽度的单位是像素。
图片(BitMap)占用的内存应该和屏幕密度(Density)无关,虽然我暂时还拿不出直接证据。
   创建一个BitMap时,其单位像素占用的字节数由其参数 BitmapFactory.Options inPreferredConfig 变量决定。
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来构造图片
:A RGB指的是一种色彩模式,里面A代表Alpha, R 表示 red G 表示 green B 表示 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中如何查看内存
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android中图片占用内存的计算 的相关文章

  • Android 中所有活动的单套接字 IO 连接

    我已经为 SocketIOClient 参考创建了 Singleton 类here https stackoverflow com questions 13709783 android socket io switch activities
  • 未捕获的 ReferenceError: myFunction 未在 null:1 处定义 Web 视图中的 Android 异常

    我正在从活动中调用 javascript 函数 但我得到了Uncaught ReferenceError myFunction is not defined at null 1错误 这是我的文件 MainActivity java pack
  • 使用 android 将图像上传到 Flickr

    我需要将 Flickr 与 android 集成 我已完成身份验证 我需要将图像上传到 flickr 但我不知道如何执行相同操作 我参考文件 http www flickr com services api upload api html
  • Android 上的多处理

    我一直在 Android 上执行一些测试 以验证并行化算法 如 FFT 的性能可以提高多少 我通过使用带有 JNI FFTW 的 pthread 和 Java 线程 来自 JTransforms 来实现这些算法 我没有像预期那样通过使用线程
  • 如何创建没有标题的DialogFragment?

    我正在创建一个 DialogFragment 来显示一些有关我的应用程序的帮助消息 除了一件事之外 一切都工作正常 窗口顶部有一条黑色条纹 显示 DialogFragment 我认为它是为标题保留的 我不想使用它 这是特别痛苦的 因为我的自
  • 将 React Native 应用程序嵌入到现有的 ios/android 应用程序中

    我需要知道是否可以在现有的 ios android 应用程序中 嵌入 一个 React Native 应用程序 而不共享 React Native 应用程序代码 我们目前有一个 React Native 应用程序 它使用一些插件依赖项 并被
  • 使用 HashMap 映射 String 和 int

    我有一个显示国家 地区名称的列表视图 我已将名称作为字符串数组存储在 strings xml 中 称为国家 地区名称 在填充 ListView 时 我使用从 strings xml 读取的 ArrayAdapter String count
  • 为什么Android room不建议使用allowMainThreadQueries()?

    我正在创建一个小型应用程序 仅在数据库中保存一些计数器 如果不存在 请插入一个 如果是的话 增加更新 该应用程序没有任何用户界面 它是一个保存和读取数据 少量表 少量记录 的插件 我可以用吗允许主线程查询 在这种情况下 每次我读到一些关于这
  • 从txt文件中读取数据而不下载它?

    我想从提供的文本文件中解析信息 有没有一种方法可以在应用程序中执行此操作 而无需先下载文件 以某种方式传输文本内容 打开到 URL 的 Http 连接 使用内置 HttpURLConnection 或使用 commons httpclien
  • 使用audioSessionId值实例化AudioFx类?

    我已经阅读了 Android API 并尝试在互联网上搜索有关声明自定义audioSessionId然后用它audioSessionId初始化 AudioFx 类并为我的 MediaPlayer 或 AudioTrack 分配硬编码audi
  • Google Play 服务,登录成功,但创建房间时出错

    我正在尝试 google play 服务示例 特别是 ButtonClicker2000 从 logcat 登录过程也正常 但我有另一个错误 06 01 22 43 15 478 D ButtonClicker2000 1565 Sign
  • 如何让 Mockito 在 androidTest 中工作

    在我的测试中 我如何模拟我编写的课程 这是我的测试代码 import android support test runner AndroidJUnit4 import org junit Before import org junit Te
  • Android 10 中没有设备筛选器的 USB_DEVICE_ATTACHED

    我正在开发一个 Android 应用程序 它在清单中为 BroadcastReceiver 注册了四个意图过滤器 这些都是 android hardware usb action USB DEVICE ATTACHED android ha
  • Google 的 Android OpenGL 教程是否教授了错误的线性代数?

    在帮助另一位用户解决有关该问题的问题后响应触摸事件 http developer android com training graphics opengl touch htmlAndroid教程 我下载了源代码 并且对我所看到的感到非常困惑
  • 获取接收者的设备令牌以在 Firebase 中发送通知

    所以我正在学习如何使用 firebase 发送设备到设备的通知 我看到了这个answer https stackoverflow com a 42548586 5237289发送通知 看起来很简单 现在 我知道要获取发件人的令牌 它应该如下
  • 手动添加带有依赖pom/iml文件的aar

    由于我无法使用私人 Maven 来共享我的库 因此我正在考虑共享 aar 并导入到另一个项目中 当 aar 和 jar 文件不包含任何依赖项时 就会出现问题 因此 一旦我在android studio中手动导入aar 使用Import JA
  • 使用Gradle组装时如何更改Android应用程序包名称?

    是否可以使用 Gradle 更改 Android 应用程序的包名称 我需要编译同一应用程序的两个副本 并具有唯一的包名称 这样我就可以向市场发布两次 作为使用的更简单的替代方案产品口味 正如伊森的回答 https stackoverflow
  • 调用外部应用程序

    如何从我的应用程序调用外部应用程序 例如 我需要打电话Shazam 应用程序 来自我的应用程序 我可以在应用程序的包名称中看到logcat 这对任何目的都有用吗 特别是对于 Shazam 以下代码有效 Intent intent new I
  • AsyncTask的并行执行

    An 异步任务单击时执行 List
  • Android:通过查找带有标签而不是 ID 的容器来添加片段

    我正在使用 for 循环创建片段的多个实例 在每个片段中 我需要添加另一组子片段 为此 我需要找到正确的容器 如果我使用容器的 ID 所有子片段都会添加到第一个父片段 而不是它们自己的父片段 在我的主要片段中 for ParentFragm

随机推荐

  • 桶排序

    本文内容和代码来源于 漫画算法 针对计数排序的局限性 xff0c 桶排序做出了弥补 xff0c 时间复杂度同样是线性级 类似于计数排序所创建的统计数组 xff0c 桶排序需要创建若干个桶来协助排序 那么桶排序中所谓的 桶 xff0c 又是什
  • 归并排序

    本文内容和代码来源于数据结构教材 归并排序 Merging Sort 是又一类不同的排序方法 34 归并 34 的含义是将2个或2个以上的有序表组合成1个新的有序表 无论是顺序存储还是链表存储结构 xff0c 都可在O m 43 n 的时间
  • 插入排序

    文章内容来源于数据结构教材 C语言版 教材讲解了4种插入排序算法 xff0c 分别为 1 直接插入排序 2 折半插入排序 3 2 路插入排序 4 表插入排序 还有一个希尔排序 属于插入排序分类 本文只将1 2 xff0c 两种算法进行了实践
  • 希尔排序

    本文内容来源于数据结构教材 C语言版 希尔排序 Shell s Sort xff0c 又称缩小增量排序 Diminishing Increment Sort xff0c 它也是一种属插入排序类的方法 xff0c 但在时间效率上较前几种插入排
  • Java swing绘制柱状图和饼图

    15 14编写程序 xff0c 使用条形图显示作业 平时测验 其中考试和期末考试占总成绩的百分比 假设作业占20 用红色显示 xff0c 平时测验占10 用蓝色显示 xff0c 其中考试占30 用绿色显示 xff0c 期末考试占40 用橙色
  • Java注解(Annotation)学习

    xff08 本文内容来源于疯狂Java讲义 xff0c 感谢 xff09 注解 Annotation Annotation是代码里的特殊标记 xff0c 这些标记可以在编译 类加载 运行时被读取 xff0c 并执行相应的处理 通过使用注解
  • Java Swing制作古老的打砖块游戏

    最近研究了一下古老的Java Swing xff0c 研究之余 xff0c 突发奇想开发了一个打砖块小游戏 首先看一下效果图 具体过程 1 游戏框架搭建1 1步骤 2 开发过程2 1各种游戏对象的绘制2 2游戏对象的运动2 3小球和砖块的碰
  • 局域网下yum代理配置

    需求背景 由于公司局域网内无法连接外网 xff0c 只有一台服务器能连接外网 xff0c 可选择搭建squid作为代理 xff0c 供无法访问外网的服务器 xff0c 安装软件使用 安装Squid yum install y squid 配
  • AndroidX迁移和吐槽

    最近引入一个第三方 xff0c 需要使用androidx扩展库 xff0c compile后发现与旧的support库无法兼容 xff0c 于是逐个的把support的库换成了androidx系列 xff0c 倒腾半天 xff0c 失败无数
  • Android中的事件

    有内容参考了别人的文章 xff0c 感谢作者 Input Events Event Listeners Event Handlers Touch Model Handling Focus https developer android co
  • Ubuntu19.10/20.04安装记录

    安装过程 官方网站下载 xff0c 搜索引擎搜索Ubuntu history version 找到19 10 xff0c 下载速度略慢 xff0c 大小大约2 3G 在Windows 上面使用UltraISO 试用版即可 刻录到u盘即可 重
  • android疑难问题收集

    1 自定义ViewGroup实现折叠展开 xff0c 离奇的折叠后又展开 在一个布局里面我参考网络代码实现了一个折叠展开的自定义viewgroup xff0c 其实是调用layout方法实现的折叠和展开 xff0c 最近出现一个bug xf
  • 开发错误笔记

    开发环境IDE Android Studio环境错误 1 布局引用的资源文件不存在的错误提示 Caused by android content res Resources NotFoundException Caused by org x
  • 程序员的送外卖经历

    今天我的一个朋友跟我发消息说 xff0c 看着外面刮着大风 xff0c 自己在屋子里面 xff0c 靠着暖气 xff0c 真是幸福啊 其实也没啥 xff0c 我这个朋友去年送了半年外卖 xff0c 大冬天依然在送 xff0c 户外骑着电动车
  • fragment添加失败错误查找

    根据源码查找原因 span class token class name Caused span by span class token operator span span class token class name span clas
  • Swing实现模仿HTML5模拟时钟特效

    自从研究了Java Swing的Graphics xff0c 觉得能按照自己的想法画出一些东西 xff0c 还是挺有意思的 xff0c 之前学习Java Swing的时候练习过一个模拟时钟 xff0c 自己觉得不错 xff0c 后来看到这个
  • jdk|adb命令行使用总结

    记录jdk的命令行使用记录 javac 1 java命令行编译多个源文件 javac d Example1 java Example2 java Example1是主类 xff0c 要用到Exmaple2 执行 xff1a java com
  • framework源码读后感

    View部分 1 ViewParent 今天查看了ViewGroup xff0c ViewRootImpl和ViewParent的部分源代码 xff0c 前面的两个类都实现了ViewParent接口 ViewGroup是一个抽象类 xff0
  • debian8 gnome 亮度调节

    debian8系统 xff0c 存在很多不兼容问题 xff0c 官方更新较慢 xff0c 但是电脑的硬件 xff0c 更新快 xff0c 很多驱动都无法在系统安装时给装好 xff0c 我装debian8系统时 xff0c 出了很多问题 例如
  • Android中图片占用内存的计算

    原帖 xff1a http blog csdn net hudashi article details 7856519 在Android开发中 xff0c 我现在发现很多人还不会对图片占用内存进行很好的计算 因此撰写该博文来做介绍 xff0