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 在内存中的大小主要是宽 高 和 分别率 有直接关系




更多相关文章

  1. Android(安卓)开发获取手机运行内存工具类
  2. Android(安卓)GifImageView加载Gif图片及原理
  3. Android中多进程的应用
  4. 最近面试Android的一些面试题
  5. 为什么说枚举更占内存,枚举原理是什么?
  6. [置顶] 一个类搞定Android适配!!
  7. Android性能测试工具使用
  8. Android学习―7种形式的Android(安卓)Dialog使用举例
  9. Android内存溢出与优化(三)——使用完后要close、recycle、unregis

随机推荐

  1. Android——实现【搜索框】与点击搜索事
  2. android中自定义标签ImageButton
  3. Cocos2d-x开发移植到安卓平台横竖屏设置
  4. android wifi工作流程
  5. Android封装BaseFragment
  6. android BitmapFactory的内存溢出
  7. Tensorflow:Android调用Tensorflow Mobile
  8. [android]_[Async异步任务使用]
  9. Android培训班(22)
  10. OpenCV Android开发环境搭建