相关概念:

  • 位深
  • 色彩空间
  • 颜色通道
  • int型占用字节

位深: 位是二进制的位。位深是指计算机系统中图片的一个像素点占用的二进制位数。例如位深32,就是使用2^8 = 32 位二进制来表示像素值。例如11111111 00000000 00000000 00000000 代表黑色,转成16进制就是 ff000000,也就是我们常见的颜色的表示方式(#ff000000)。

色彩空间: 色彩空间又叫色域。是指颜色的范围、集合。在描述颜色时,颜色范围可以是立体而不单单是平面的,所以用空间来形容更为合适。 例如hsl,hsv色彩空间,它们对颜色的描述就是立体的。

颜色通道: 通道是合成图片的单位、容器。所有通道中的所有颜色要素(要素不一定是颜色),经过渲染合成了一个彩色图片。例如cmyk有c,m,y、k四个通道,每个通道对应一种构成颜色的要素,4个通道中的颜色值合一,就成了一个图片。其他如lab、rgb等色彩模式成像的过程也是类似的。

int型占用字节数: java中int型占用32位内存==4字节。表现形式就是32个二进制位(01)。用这32个二进制表示正负整数,因为其中有一位是正负符号位,故而其实只有31位是数字,于是int型能够表示的整数范围就是

10000000 00000000 00000000 0000000001111111 11111111 11111111 11111111
`

-2^31 ~ 2^31-1 (-2147483648~2147483647)。


Android中的bitmap

Bitmap就是位图,我们也就是我们常见的xxx.bmp图。

位图所占内存

1024 * 1024像素的位图,保存时设置位深32位,无压缩,且不添加额外描述信息时,在硬盘上一定是(1024 x 1024 x 32) 位 = (1024 x 1024 x 32 / 8)字节 = 4兆,不多不少,若位深24,则为3M。这一点可以用Photoshop随意保存一张bmp格式的图来验证。

安卓中颜色的表示

java 中一个int型占用内存为4字节。最高正好足够用来描述32位深的图片。例如:int 黑色 = 0xff000000 = 11111111 00000000 00000000 00000000。是一个负数。

安卓Bitmap配置

安卓中Bitmap配置 Config.ARGB_8888,表示的是argb每个通道中的色彩都使用2^8=256个级别(00~ff)来表示。其位深就是8(位)*4(通道) = 32。

其他配置如:

Config.ARGB_4444 = 4*4 = 16位深。
Config.RGB_565 = 5+6+5 = 16位深。其中r通道和b通道颜色级别划分为2^5个颜色,g为2^6个颜色。

说了那么多。其实位图占用内存大小就是像素数组占用内存大小。

但是,这个数组,类型可能是不一样的。Bitmap的许多实现是底层的,由C/C++控制的,像rgb565,argb4444 这种一个像素占用16位==2个字节的配置来说,使用int32会造成内存浪费,但具体进行了怎么的优化就不知道了,在java层,我们是看不到的。

安卓中Bitmap所占内存

嗯,安卓中位图所占的内存当然也是应该是数组所占内存来的,但是具体到bitmap对象,自然有所不同,因为图片编码并不是没有除了色彩之外的其他信息,同时在具体算法、操作细节上,都可能影响到Bitmap。像素数组占用内存大小只能说是构成一个bitmap所需的最小内存。

so,要计算bitmap占用内存,还是得参看官方的api:

bitmap.getByteCount(); //返回可以用来存储这个位图的像素的最小字节数。

这个方法实际上也是计算像素数组所占内存大小(一行所占行字节总数 * 高)看其源码:

public final int getByteCount() {if (mRecycled) {Log.w(TAG, "Called getByteCount() on a recycle()'d bitmap! "+ "This is undefined behavior!");return 0;}// int result permits bitmaps up to 46,340 x 46,340return getRowBytes() * getHeight();}

但是,源码推荐我们用下面这个:

bitmap.getAllocationByteCount();

这个方法是api19开始推荐用的,是一个native方法,计算内存大小的方法在c/c++ 层。更为合理了。

so,最后整理得出计算bitmap占用内存大小的代码:

    /*** 计算bitmap位图所占的内存大小** @param bitmap* @return bitmap占用的内存大小*/@SuppressLint("NewApi")public static int getBitmapSize(Bitmap bitmap) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {return bitmap.getAllocationByteCount();}if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR1) {return bitmap.getByteCount();}if (!bitmap.isRecycled()) {return bitmap.getRowBytes() * bitmap.getHeight();}return 0;}

其他说的不准确的地方,就不关我的事了。黑黑。

——end

安卓中图片占用内存大小分析相关推荐

  1. 安卓图片内存优化(一)——图片占用内存大小的计算

    安卓开发中经常会遇到因为图片处理不当导致的oom问题,因为系统分配给每个应用的最大内存空间是有限的,正常只有几十上百兆(排除通过特殊手段获取到几百兆内存空间的情况).所以为了节省更多的空间需要对图片进 ...

  2. android 图片占用内存大小及加载解析

    *本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 在讲解图片占用内存前,我们先问自己几个问题: 我们在对手机进行屏幕适时,常想可不可以只切一套图适配所有的手机呢? 一张图片加载到手 ...

  3. Java 中对象占用内存大小计算

    原文地址 mp.weixin.qq.com byte 与 bit bit:位,比特.信息的最小单位,二进制数中的一个位数 (二进制位),其值为"0" 或"1": ...

  4. Android 中图片占用内存分析

    Android 在加载图片的时候一定会考虑到的一个点就是如何防止 OOM,那么一张图片在加载的时候到底会占用多少内存呢?有哪些因素会影响占用的内存呢?知道了这些,我们才能知道可以从哪些点去优化,从而避 ...

  5. 安卓的图片占用内存,图片分辨率,图片适配不同屏幕的研究

    首先本文主要解决以下几个问题: 1.什么是DPI,什么是dp,什么是PX,什么是desity,这些干嘛用? 2.一张图片在安卓中到底占多少内存? 3.为什么安卓app的res目录下要用多个文件夹存放图 ...

  6. IKAnalyzer词典占用内存大小分析

    转载原文:http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f7387a9f8a4624c3933fc2390 ...

  7. Android | 如何计算图片占用内存的大小

    前言 对于一张图片,你知道应该存放在那个资源目录下面吗,或者说,放在那个资源目录下加载起来更省内存呢?在日常开发中我们可能不太注意这些东西,但是这些却是基础,是必不可少的一环,所以这几天重新温习了一下 ...

  8. android 图片占用内存的计算

    Android高效内存1:一张图片占用多少内存 在做内存优化的时候,我们发现除了解决内存泄露问题,剩下的就只有想办法减少真实的内存占用.而在App中,大部分内存可能被我们图片占用了,所以减少图片的内存 ...

  9. per.ccz与png图片占用内存对比

    pvr相比png优势 1.压缩,2gpu能直接识别,不需要额外的内存开销,3.可以自定义色深 pvr与png的内存占用    转载▼ Zwoptex生成的spritesheet除了可以导出png格式的 ...

最新文章

  1. Command模式的实践
  2. 判断一个数是不是2的指数幂
  3. Asp.net MVC 示例项目Suteki.Shop分析之---ViewData
  4. 通向成功的23个方法
  5. 如何解释营销能力与技术能力是正交的
  6. Winrunner与QTP
  7. 统计长整数n的各位上出现数字1、2、3 的次数
  8. Gradle_04_解决多项目同级依赖时找不到符号的异常
  9. PAT-乙级-1035 插入与归并
  10. SAP系统-WMS Paywall 接口代码-立哥开发
  11. Windows 2000虚拟机安装全过程(VMware)
  12. Matlab计算标准时间格式下时间差
  13. 伊甸园日历游戏 c语言,洛谷 P1024 — 一元三次方程求解
  14. Updating indexes
  15. python编写回文程序上海自来水来自海_2019春Python程序设计练习3(0402--0408)
  16. EnjoyingSoft之Mule ESB开发教程第五篇:控制消息的流向-数据路由
  17. 【Java+MySQL】随机添加测试数据栗子
  18. 黑苹果升级更新macOS 13 Ventura 问题整理
  19. 机械臂规划----三次样条曲线
  20. ClickHouse查询语句详解

热门文章

  1. 华为U-SYS系统力助运营商实施转型
  2. c语言求任意球的体积,【C.Ronaldo】嘉实多极护见证最强C语言
  3. linux下删除以 - 开头的文件
  4. 做到这一点,你也可以成为优秀的程序员(转)
  5. 设计模式--静态工厂、简单工厂方法案例分析
  6. java实验:正n多边形类的定义与使用
  7. 服务器如何安装虚拟机,服务器如何安装虚拟机
  8. 区块链与金融IT“联姻”的思路和方案
  9. HashMap是如何遍历的
  10. 人工智能(1)-样本空间、假设空间、版本空间