Bitmap在内存中加载

<pre name="code" class="java">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";

	@Override
	protected 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 的分辨率的Bitmap
		int byteCount = bitmap.getByteCount();            // 获取大小 字节总数
		int  kbCount = byteCount / 1000;                  // 转化为KB
		int  mbCount = kbCount / 1000; 	                  // 转化为MB
		logD( 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 在内存中的大小主要是宽 高 和 分别率 有直接关系




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值