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


相关推荐

  • 本地测试读取redis和普通文件缓存的速度,redis慢一倍?

    本地测试读取redis和普通文件缓存的速度,redis慢一倍?

    2021年10月16日
    48
  • 数据接口-免费版(股票数据API)「建议收藏」

    获取股票数据的源头主要有:数据超市、雅虎、新浪、Google、和讯、搜狐、ChinaStockWebService、东方财富客户端、证券之星、网易财经。数据超市2016年5月6日更新。根据最近频繁出现的数据超市,可以无限制获取相关数据,而不再需要使用爬虫等方式获取,这样不仅节省了极大资源,也有利于遍历数据。具体的方法不再赘述,列出来相关网站清单,开发者可自行到这些网站查询调用方法。聚合数据 htt…

    2022年4月7日
    77
  • 剖析RT-Thread中console与finsh组件实现(2)[通俗易懂]

    剖析RT-Thread中console与finsh组件实现(2)[通俗易懂]接上一章剖析RT-Thread中finsh组件实现(1),rt_device具体定义如下:其中内核基类定义如下:所以刚才串口1初始化后名称被初始化为了“usart1”,与刚才设置终端时入参刚好可以匹配。而这个标志是类型标志,串口类型即为RT_Object_Class_Device,同时也是一个静态类,所以会或上0x80其实rt_device中最重要的是传入了设备回调与操作函数指针,这些指针此时指向的是串口1的一系列操作函数。这些函数被初始化在串口1初始化的rt_hw_serial

    2022年5月12日
    42
  • Flake8学习

    Flake8学习                 转载: Python静态代码检查工具Flake8   Flake8简介

    2025年11月3日
    5
  • nginx和apache的区别,选择哪个好?

    nginx和apache的区别,选择哪个好?Apache和Nginx最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;而nginx是异步的,多个连接(万级别)可以对应一个进程。下面本篇文章就来给大家介绍一下Apache和Nginx的区别有那些,选择哪个好?希望对你们有所帮助。一、Nginx特点  1、轻量级,采用C进行编写,同样的web服务,会占用更少的内存及资源。  2、抗并发,nginx以epollandkqueue作为开发模型,处理请求是异步非阻塞的,负载能力比apache高很多,而apache则.

    2022年5月24日
    37
  • unknowndevice修复_eclipse unable to launch

    unknowndevice修复_eclipse unable to launch相信做Android开发的,都会遇到这个问题,在这里,仅仅给自己解决问题的方式,供大家参考看一下图片,图片是从别的网站上摘的解决方案:1.重启手机;(我的解决方法,是在StackOverflow看到的 http://stackoverflow.com/questions/10731375/eclipse-target-unknown-in-android-device-

    2022年10月4日
    3

发表回复

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

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