[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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • UML的9种常用图与建模工具详解「建议收藏」

    UML的9种常用图与建模工具详解「建议收藏」UML即UnifiedModelLanguage,是一种建模语言,也是标准建模语言。在软件开发中,当系统规模比较复杂时,需要用图形抽象地来表达复杂的概念,让整个软件设计更具有可读性,可理解性,以便

    2022年7月4日
  • Sublime Text3 编译运行java程序

    Sublime Text3 编译运行java程序SublimeText3编译运行java程序一、必须的准备工作1.计算机上成功安装好javaJDK,并且设置好环境变量。2.计算机上安装的有SublimeTtext3。二、配置SublimeTtext31.找到SublimeTtext3的安装目录下的“Packages”文件夹2.在“Packages”文件夹中找到Java.sublime-packag…

    2022年7月27日
  • pycharm激活码20120破解方法

    pycharm激活码20120破解方法,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月15日
  • loadrunner12使用手册_loadrunner脚本编写教程

    loadrunner12使用手册_loadrunner脚本编写教程首先我们安装好loadrunner12之后,出现这三个图标,然后开始操作。操作:1.打开VirtualUserGenerator,新建脚本2.选择脚本协议,对脚本名称位置可以进行编辑。此处以web-http/html为例。3.点击创建后,选择录制脚本,填写好录制的地址,应用程序,然后选择开始录制,此处以测试登录为例4.结束录制后,点击关联回放,确保脚本无误5.对代码进行进一步完善,插入事务或集合点6.对脚本进行执行回放,确保脚本无误,对脚本进行参数化可以直

    2022年10月14日
  • 刷流量和刷点击率的方法探讨

    本文主要用到的工具软件有《网页自动操作通用工具》或《网页自动刷新监控工具》,其中《网页自动操作通用工具》包含《网页自动刷新监控工具》所有功能,所以主要以前者为例说明。请自行在网上搜索和下载软件。许多朋友需要用到提高流量或点击率,比如:提高自己博客访问量,小说访问量,视频点击率,论坛帖子点击率等。这样就可以提高自己的排名或在网…

    2022年4月13日
  • QTcpSocket简单使用[通俗易懂]

    QTcpSocket简单使用[通俗易懂]QTcpServer类提供一个TCP基础服务类继承自QObject这个类用来接收到来的TCP连接,可以指定TCP端口或者用QTcpServer自己挑选一个端口,可以监听一个指定的地址或者所有的机器地址。调用listen()来监听所有的连接,每当一个新的客户端连接到服务端就会发射信号newConnection()调用nextPendingConnection()来接受待处理的连接。返回一个连接的QTcpSocket(),我们可以用这个返回的套接字和客户端进行连接如果有错误,serverErr.

    2022年9月9日

发表回复

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

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