Bitmap在内存中加载
16lz
2021-01-26
package com.danjiang.bitmapdemo;import android.annotation.SuppressLint;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.Bitmap.Config;import android.os.Bundle;import android.util.Log;import android.widget.Toast;/** * *Author: ZhangDanJiang * * Date:2016年6月8日 Time: 下午5:42:36 * * Function: Bitmap 在内存中加载 * * * 图片的存在的不同形式 * ①:文件形式,即以二进制形式存在于硬盘上,file.length() * ②:流的形式,即以二进制形式存在于内存中,将文件读取到流中时,流的大小和文件在磁盘中显示的大小是一样的 * ③:Bitmap形式,即以RGBA(默认)形式存在于内存中 * * 在Android3.0之前,Bitmap的内存分配分为两部分,一部分是分配在Dalvik的VM堆中,而像素数据的内存是分配在Native堆中, * 而到了Android3.0之后,Bitmap的内存则已经全部分配在VM堆上,这两种分配方式的区别在于, * Native堆的内存不受Dalvik虚拟机的管理,我们想要释放Bitmap的内存,必须手动调用Recycle方法, * 而到了Android 3.0之后的平台,我们就可以将Bitmap的内存完全放心的交给虚拟机管理了, * 我们只需要保证Bitmap对象遵守虚拟机的GC Root Tracing的回收规则即可。OK,基础知识科普到此。 * * Bitmap图片占用内存计算: * Bitmap图片在加载到内存的时候是按照下面的计算公式 * 计算公式:占用内存大小= Bitmap 宽度 * 高度 * 每个像素占用的内存 = 像素总数 * 每个像素占用的内存 * 你可以把图片看成是由width行、height列的矩阵组成,每一个矩阵元素代表一个像素点, * 每一个像素点都是1byte整数倍的数据,这个数据越大,表示的色彩就越丰富,图片的显示质量就越高。 * * Bitmap有四种像素类型: * ARGB_8888、 4 字节 * ARGB_4444、 4 字节 * ARGB_565、 2 字节 * ALPHA_8, 1 字节。 * 一个1000*1000的ARGB_8888类型的Bitmap占用的内存为1000*1000*4 byte= 4000000byte = 4000kb = 4MB。 */@SuppressLint("NewApi")public class MainActivity extends Activity {private static final String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Config config = Bitmap.Config.ARGB_8888;String string = "ARGB_8888";// 分别打印不同配置下创建Bitmap的大小printBitmapCount(config, string);printBitmapCount(Config.ARGB_4444, "ARGB_4444");printBitmapCount(Config.RGB_565, "RGB_565");printBitmapCount(Config.ALPHA_8, "ALPHA_8");}/** * 创建一个1000 * 1000 的分辨率的Bitmap 配置不同的config * @param config Bitmap.Config参数 * @param string 名字 */private void printBitmapCount(Config config, String string) {Bitmap bitmap = Bitmap.createBitmap(1000, 1000, config); // 创建一个1000 * 1000 的分辨率的Bitmapint byteCount = bitmap.getByteCount(); // 获取大小 字节总数int kbCount = byteCount / 1000; // 转化为KBint mbCount = kbCount / 1000; // 转化为MBlogD( string + " kbCount ==" + kbCount + "KB");//logD( string + " mbCount ==" + mbCount + "MB");}/** * 打印日志 * @param string 输出内容 */public void logD(String string){Log.d(TAG, string);}public void toast(String string){Toast.makeText(this, string, 0).show();}}
输出结果
Bitmap 在文件中的大小 和 Bitmap在内存的大小 没有任何关系
Bitmap 在内存中的大小主要是宽 高 和 分别率 有直接关系
更多相关文章
- Android(安卓)开发获取手机运行内存工具类
- Android(安卓)GifImageView加载Gif图片及原理
- Android中多进程的应用
- 最近面试Android的一些面试题
- 为什么说枚举更占内存,枚举原理是什么?
- [置顶] 一个类搞定Android适配!!
- Android性能测试工具使用
- Android学习―7种形式的Android(安卓)Dialog使用举例
- Android内存溢出与优化(三)——使用完后要close、recycle、unregis