安卓中图片占用内存大小分析
来源:互联网 发布:联通互联网套餐 知乎 编辑:程序博客网 时间:2024/05/21 13:56
相关概念:
- 位深
- 色彩空间
- 颜色通道
- 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 00000000
到 01111111 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,340 return 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
- 安卓中图片占用内存大小分析
- android 计算图片占用内存大小
- IKAnalyzer词典占用内存大小分析
- android_java中图片占用内存大小问题
- 计算图片的所占用内存大小
- android 图片占用内存大小及加载解析
- android 图片占用内存大小及加载解析
- Android图片占用内存大小及加载解析
- 怎样计算图片占用的内存大小
- PHP数组实际占用内存大小的分析
- PHP数组实际占用内存大小的分析
- PHP数组实际占用内存大小的分析
- PHP数组实际占用内存大小的分析
- PHP数组实际占用内存大小的分析
- PHP数组实际占用内存大小的分析
- PHP数组实际占用内存大小的分析
- PHP数组实际占用内存大小的分析
- 图片占用内存大小计算---pvr和png为例子
- NYOJ 488 素数环
- C#图片按比例缩放
- Windows下查看文件MD5值
- Python自学之路第二步——字符串的处理
- 第一天学习
- 安卓中图片占用内存大小分析
- android sdk | API level 24 | R.array
- Java基础-面向对象的封装和重载
- 统计学习方法----统计学习知识综述
- 新零售 更加需要以人为本
- php 缩略图封装类 制作缩略图
- VLC直接播放h.264裸流(通过配置SEI信息实现)
- mysql 无法退出sql命令行编辑
- RT-Thread 学习笔记(六)——串口