[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屏幕适配知识

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • mysql联合索引失效

    mysql联合索引失效联合索引,能够缩小查询范围的字段放在第一个,比如表sensor_coc_repay_feature存近一个月数据两千多万条,建立联合索引(time,distinct_id),按照查询select*fromsensor_coc_repay_featurewheredistinct_id=%sandtime>‘2022-02-20’,此时然后按照联合索引最左匹配有使用到了time,distinct_id,但是经过time查询后的数据还会是全表,mysql会认为该查询还不如走全表查询

  • 将截断字符串或二进制数据是什么意思_截取字符串中的一部分

    将截断字符串或二进制数据是什么意思_截取字符串中的一部分今天做数据库练习的时候,往一个student表中在新建查询中用T-Sql语句插入一条记录。insertintostudentvalues(‘090120′,’陈冬’,’男’,19,’信息系’,’1234567′)系统老显示:将截断字符串或二进制数据,语句已结束。……………………原因:找到student表,查看表的数据类型,才知道在定义ssex时,把ssex的数据类型定义为:c…

  • mysql 多表查询和更新_MySQL update select 多表关联查询更新

    mysql 多表查询和更新_MySQL update select 多表关联查询更新在遇到需要update设置的参数来自从其他表select出的结果时,需要把update和select结合使用,不同数据库支持的形式不一样,在mysql中如下:updateAinnerjoin(selectid,namefromB)conA.id=c.idsetA.name=c.name;根据AB两个表的id相同为条件,把A表的name修改为B的sql语句就如上所示参考…

  • Eclipse程序员要掌握的常用快捷键建议收藏

    判断一个人的编程水平,就看他用键盘多,还是鼠标多。用键盘一是为了输入代码(当然了,也包括注释),再有就是熟练使用快捷键。所以在网上找了一下,自己也总结了些用得比较多的,和大家一起分享一下。Ctrl+K

    2021年12月20日
  • java 股票历史数据_获取股票的历史数据

    java 股票历史数据_获取股票的历史数据packagecom.xiaole.stock;importjava.util.ArrayList;importjava.util.List;importorg.jsoup.Jsoup;importorg.jsoup.nodes.Document;importorg.jsoup.nodes.Element;importorg.jsoup.select.Elements;publicclassGe…

  • PHP内置服务器

    PHP内置服务器

    2021年10月17日

发表回复

您的电子邮箱地址不会被公开。

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