Bitmap在内存中加载(另一账号)

来源:互联网 发布:网络靶场如何构建 编辑:程序博客网 时间:2024/06/06 00:05
[java] view plain copy
  1. <pre name="code" class="java">package com.danjiang.bitmapdemo;  
  2.   
  3. import android.annotation.SuppressLint;  
  4. import android.app.Activity;  
  5. import android.graphics.Bitmap;  
  6. import android.graphics.Bitmap.Config;  
  7. import android.os.Bundle;  
  8. import android.util.Log;  
  9. import android.widget.Toast;  
  10. /** 
  11.  * 
  12.  *  Author: ZhangDanJiang 
  13.  * 
  14.  *  Date:2016年6月8日  Time: 下午5:42:36 
  15.  * 
  16.  *  Function: Bitmap 在内存中加载 
  17.  *   
  18.  *   
  19.  *  图片的存在的不同形式 
  20.  *  ①:文件形式,即以二进制形式存在于硬盘上,file.length() 
  21.  *  ②:流的形式,即以二进制形式存在于内存中,将文件读取到流中时,流的大小和文件在磁盘中显示的大小是一样的 
  22.  *  ③:Bitmap形式,即以RGBA(默认)形式存在于内存中 
  23.  *   
  24.  *  在Android3.0之前,Bitmap的内存分配分为两部分,一部分是分配在Dalvik的VM堆中,而像素数据的内存是分配在Native堆中, 
  25.  *  而到了Android3.0之后,Bitmap的内存则已经全部分配在VM堆上,这两种分配方式的区别在于, 
  26.  *  Native堆的内存不受Dalvik虚拟机的管理,我们想要释放Bitmap的内存,必须手动调用Recycle方法, 
  27.  *  而到了Android 3.0之后的平台,我们就可以将Bitmap的内存完全放心的交给虚拟机管理了, 
  28.  *  我们只需要保证Bitmap对象遵守虚拟机的GC Root Tracing的回收规则即可。OK,基础知识科普到此。 
  29.  *   
  30.  *  Bitmap图片占用内存计算: 
  31.  *  Bitmap图片在加载到内存的时候是按照下面的计算公式 
  32.  *  计算公式:占用内存大小= Bitmap 宽度 * 高度 * 每个像素占用的内存 = 像素总数 * 每个像素占用的内存 
  33.  *  你可以把图片看成是由width行、height列的矩阵组成,每一个矩阵元素代表一个像素点, 
  34.  *  每一个像素点都是1byte整数倍的数据,这个数据越大,表示的色彩就越丰富,图片的显示质量就越高。 
  35.  *   
  36.  *  Bitmap有四种像素类型: 
  37.  *  ARGB_8888、     4 字节 
  38.  *  ARGB_4444、     4 字节 
  39.  *  ARGB_565、       2 字节 
  40.  *  ALPHA_8,          1 字节。 
  41.  *  一个1000*1000的ARGB_8888类型的Bitmap占用的内存为1000*1000*4 byte= 4000000byte = 4000kb = 4MB。 
  42.  */  
  43. @SuppressLint("NewApi")  
  44. public class MainActivity extends Activity {  
  45.     private static final String TAG = "MainActivity";  
  46.   
  47.     @Override  
  48.     protected void onCreate(Bundle savedInstanceState) {  
  49.         super.onCreate(savedInstanceState);  
  50.         setContentView(R.layout.activity_main);  
  51.           
  52.         Config config = Bitmap.Config.ARGB_8888;  
  53.         String string = "ARGB_8888";  
  54.         // 分别打印不同配置下创建Bitmap的大小  
  55.         printBitmapCount(config, string);  
  56.         printBitmapCount(Config.ARGB_4444, "ARGB_4444");  
  57.         printBitmapCount(Config.RGB_565, "RGB_565");  
  58.         printBitmapCount(Config.ALPHA_8, "ALPHA_8");  
  59.     }  
  60.   
  61.     /** 
  62.      * 创建一个1000 * 1000 的分辨率的Bitmap 配置不同的config 
  63.      * @param config Bitmap.Config参数 
  64.      * @param string 名字 
  65.      */  
  66.     private void printBitmapCount(Config config, String string) {  
  67.           
  68.         Bitmap bitmap = Bitmap.createBitmap(10001000, config); // 创建一个1000 * 1000 的分辨率的Bitmap  
  69.         int byteCount = bitmap.getByteCount();            // 获取大小 字节总数  
  70.         int  kbCount = byteCount / 1000;                  // 转化为KB  
  71.         int  mbCount = kbCount / 1000;                    // 转化为MB  
  72.         logD( string + " kbCount ==" + kbCount + "KB");  
  73. //      logD( string + " mbCount ==" + mbCount + "MB");  
  74.     }  
  75.     /** 
  76.      * 打印日志 
  77.      * @param string 输出内容 
  78.      */  
  79.     public void logD(String string){  
  80.         Log.d(TAG, string);  
  81.     }  
  82.       
  83.       
  84.     public void toast(String string){  
  85.         Toast.makeText(this, string, 0).show();  
  86.     }  
  87.       
  88.       
  89.       
  90. }  
[java] view plain copy
  1.   

输出结果

Bitmap 在文件中的大小 和 Bitmap在内存的大小 没有任何关系
Bitmap 在内存中的大小主要是宽 高 和 分别率 有直接关系


http://blog.csdn.net/rememberthedream/article/details/51615121

0 0