[Android] Bitmap的内存计算

本文聚焦的问题1、Bitmap中像素数据占用多大内存?如何计算?2、不同图片来源对内存大小有什么影响?Bitmap bitmap = Bitmap.createBitmap(100,100,Bitmap.Config.ARGB_8888);依然以如此声明一个bitmap为例,参数就决定了bitmap的大小。(以Android 8.0+平台为例,这行代码执行后占用的总内存大小=bitmap在…

大家好,又见面了,我是全栈君。

本文聚焦的问题
1、Bitmap中像素数据占用多大内存?如何计算?
2、不同图片来源对内存大小有什么影响?

Bitmap bitmap = Bitmap.createBitmap(100,100,Bitmap.Config.ARGB_8888);
依然以如此声明一个bitmap为例,参数就决定了bitmap的大小。(以Android 8.0+平台为例,这行代码执行后占用的总内存大小=bitmap在栈上的引用大小+bitmap指向的堆中的对象大小+指向的对象持有的native像素数据大小,先只关注像素数据,以后再研究其他几部分的内存占用如何计算。)

像素数据的内存=图片宽 x 图片高 x 单个像素内存大小,
这里宽高均为100,单个像素的内存因为是ARGB_8888格式所以为4x8bit = 4byte,总大小=100x100x4byte。
如果宽高不变,用Bitmap.Config.RGB_565格式加载,则大小=100x100x2byte。
这是在内存中直接创建的一个bitmap,其他来源的图片加载成bitmap大小会有所不同?

一张100×100的png图片,放在下面各个不同位置,以720×1080像素4.8寸的手机(像素密度305,属于xhdpi)去加载,都加载为ARGB_8888格式,计算加载后的bitmap像素数据内存大小。
在这里插入图片描述
文件&网络&assert文件夹&res/drawable-nodpi文件夹
从这些位置加载图片会保持原尺寸,不缩放,bitmap宽高100×100,内存=100x100x4byte

res/drawable-mdpi文件夹
因为该文件夹的目标设备是mdpi,显示到xhdpi的设备上,要做放大320/160=2倍,加载后的bitmap宽高200×200,内存200x200x4byte

res/drawable-hdpi文件夹
该文件夹目标设备是hdpi,显示到xhdpi设备上,要放大320/240倍,加载后的bitmap宽高133×133,内存133x133x4byte

res/drawable-xhdpi文件夹
因为文件夹和设备屏幕像素密度相同,不做缩放,加载后bitmap宽高100×100,内存100x100x4byte

res/drawable-xxhdpi文件夹
因为文件夹目标设备是xxhdpi,显示到xhdpi设备上,要缩小320/480倍,加载后bitmap宽高75×75,内存75x75x4byte

res/drawable-xxhdpi文件夹计算方式类似。

res/drawable文件夹
该文件夹为基准分辨率,与res/drawable-mdpi文件夹效果相同。

参考
Android Bitmap加载内存占用彻底分析
Android屏幕适配知识

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/121302.html原文链接:https://javaforall.net

(0)
上一篇 2022年3月11日 下午5:00
下一篇 2022年3月11日 下午5:00


相关推荐

  • 捣鼓PlantUML(三、时序图)

    捣鼓PlantUML(三、时序图)简单介绍时序图 SequenceDiag 又名序列图 循序图 顺序图 是一种 UML 交互图 它通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作 它可以表示用例的行为顺序 当执行一个用例行为时 其中的每条消息对应一个类操作或状态机中引起转换的触发事件 PlantUML 使用 箭头将一条消息连接两个对象 参与者 对象本身不需要特别声明 如果想使用虚线箭头 则使用 箭头方向调转

    2026年3月17日
    4
  • java oracle数据备份_Java实现Oracle数据库备份

    java oracle数据备份_Java实现Oracle数据库备份今天将非常早就实现的一个Oracle数据库备份功能粘贴出来,这个功能是在大学做阶段设计时写的:importjava.io.File;importjava.io.IOException;/***Oracle数据库备份**@authorGaoHuanjie*/publicclassOracleDatabaseBackup{/***Java代码实现Oracle数据库导出**@auth…

    2022年7月12日
    22
  • java枚举类型enum用法_深入理解java枚举类型enum用法

    java枚举类型enum用法_深入理解java枚举类型enum用法enum 的全称为 enumeraTIon 是 JDK1 5 中引入的新特性 存放在 java lang 包中 下面是我在使用 enum 过程中的一些经验和总结 原始的接口定义常量 publicinterf StringMON Mon StringTUE Tue StringWED Wed StringTHU Thu Stri

    2026年3月19日
    2
  • trylock 用法_Java lock

    trylock 用法_Java lock在并发编程中,为了避免多线程同时读写共享资源,我们需要互斥。Go标准库提供了互斥锁sync.Mutex,通过加锁Lock()方法和解锁Unlock()方法达到对共享资源的并发控制。在之前的设计中,当锁被占有,其他goroutine尝试获取锁时会被阻塞。这种方式当然是合理的,但是在某些情况下,或许我们希望在获取锁失败时,并不想停止执行,而是可以进入其他的逻…

    2022年10月10日
    6
  • Retrofit2 详解和使用(一)

    Retrofit2 详解和使用(一)前言 要么出击 要么出局 命运女神总会眷顾拼尽全力的一方 一 概述 1 什么是 retrofitretr 是现在比较流行的网络请求框架 可以理解为 okhttp 的加强版 底层封装了 Okhttp 准确来说 Retrofit 是一个 RESTful 的 http 网络请求框架的封装 因为网络请求工作本质上是由 okhttp 来完成 而 Retrofit 负责网络请求接口的封装 本质过

    2026年3月20日
    2
  • 浅谈C++多态性

    浅谈C++多态性

    2021年12月2日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号