代码改变世界

[Android学习笔记]Bitmap,BitmapDrawable,BitmapFactory学习笔记

2014-04-22 14:26  hellenism  阅读(1227)  评论(0编辑  收藏  举报

Bitmap:图片文件的封装,可以看做是一张位图
此类中的静态方法可以通过源Bitmap创建新的Bitmap对象
此类封装了位图的一些信息
Bitmap文档

 

BitmapFactory:一个工具类,用于创建Bitmap对象
使用此类可以通过文件,资源,byte-array等创建Bitmap对象
BitmapFactory文档

 

BitmapDrawable:是Drawable类的扩展,Drawable是一个可以绘制到屏幕上的一个对象,BitmapDrawable则为可以会知道屏幕上的一个位图对象
BitmapDrawable对象中封装了Bitmap对象
BitmapDrawable文档

 

ImageView:图片控件,用于承载Bitmap绘制在屏幕上
图片控件,需要显示图片时需要把Bitmap,set给它
ImageView文档


example:
		// 1.
		// 使用BitmapFactory,从资源中创建Bitmap,把Bitmap set给ImageView
		Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.pic);
		ImageView imageView = new ImageView(this);
		imageView.setImageBitmap(bitmap);
		rl.addView(imageView);
		
		// 2.
		// 使用BitmapFactory,从InputStream中创建Bitmap
		// 模拟创建InputStream
		Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.pic);
		ByteArrayOutputStream  byteStream = new ByteArrayOutputStream ();
		bitmap.compress(Bitmap.CompressFormat.PNG,100, byteStream);
		
		// 得到InputStream
		ByteArrayInputStream byteInputStream = new ByteArrayInputStream(byteStream.toByteArray());

		// 通过InputStream创建Bitmap
		Bitmap newBitmap = BitmapFactory.decodeStream(byteInputStream);
		ImageView imageView = new ImageView(this);
		imageView.setImageBitmap(newBitmap);
		rl.addView(imageView);
		
		// 3.
		// 使用BitmapFactory,有Byte-Array中创建Bitmap
		// 模拟获取byte-array
		Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.pic);
		ByteArrayOutputStream  byteStream = new ByteArrayOutputStream ();
		bitmap.compess(Bitmap.CompressFormat.PNG,100, byteStream);
		
		// 得到bytes
		byte[] bytes = byteStream.toByteArray();
		byteStream.close();
		
		// 通过byte-array创建Bitmap
		Bitmap newBitmap = BitmapFactory.decodeByteArray(bytes,0,bytes.length);
		ImageView imageView = new ImageView(this);
		imageView.setImageBitmap(newBitmap);
		rl.addView(imageView);
		
		// 4.
		// 使用BitmapFactory,从SD卡中获取Bitmap
		String sdPath = Environment.getExternalStorageDirectory().toString();
		sdPath += "/orderMenu.png";
		Bitmap bitmap = BitmapFactory.decodeFile(sdPath);
		ImageView imageView = new ImageView(this);
		imageView.setImageBitmap(bitmap);
		rl.addView(imageView);
		
		// 5.
		// 使用Bitmap的静态方法从originBitmap创建新的Bitmap对象
		Bitmap originBitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.pic);
		Bitmap bitmap = Bitmap.createBitmap(originBitmap, 100, 100, 300, 300);
		ImageView imageView = new ImageView(this);
		imageView.setImageBitmap(bitmap);
		rl.addView(imageView);
		
		// 6.
		// 使用BitmapDrawable填充ImageView
		Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.pic);
		BitmapDrawable bitmapDrawable = new BitmapDrawable(this.getResources(),bitmap);
		ImageView imageView = new ImageView(this);
		imageView.setImageDrawable(bitmapDrawable);
		rl.addView(imageView);
		
		// 7.
		// 获取图片的尺寸
		BitmapFactory.Options opts = new BitmapFactory.Options();  
		opts.inSampleSize = 1;    
        opts.inJustDecodeBounds = false;  
        // 从Bitmap获取图宽高
		Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.pic,opts);
		Log.d("test","Bitmap width:" + bitmap.getWidth() + " Btimap height:" + bitmap.getHeight());
		// 从BitmapDrawable获取图片宽高
		BitmapDrawable bitmapDrawable = new BitmapDrawable(this.getResources(),bitmap);
		Log.d("test","BitmapDrawable width:" + bitmapDrawable.getIntrinsicWidth() + " BitmapDrawable height:" + bitmapDrawable.getIntrinsicHeight());
		ImageView imageView = new ImageView(this);
		imageView.setImageBitmap(bitmap);
		rl.addView(imageView);
		
		// 8.
		// 强制释放Bitmap
		if(!bitmap.isRecycled())
			bitmap.recycle();
 

有一个问题:
一张图片,分别放到drawable-mdpi/drawable-ldpi/drawable-hdpi/drawable-xhdpi/drawable-xxhdpi中,获取到内存中创建成为Bitmap对象之后,使用
getWidth(),getHeight()获取到的值都是不相同的,这是什么情况?

这问题是Android系统对图片资源管理造成的,具体新情况得重新写一篇笔记