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


    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 " + bitmap.getWidth() + " Btimap height:" + bitmap.getHeight());
    		// 从BitmapDrawable获取图片宽高
    		BitmapDrawable bitmapDrawable = new BitmapDrawable(this.getResources(),bitmap);
    		Log.d("test","BitmapDrawable " + 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系统对图片资源管理造成的,具体新情况得重新写一篇笔记

    人生就是一局不能Again的DOTA
  • 相关阅读:
    dedecms文章标题是在哪个数据库表?要批量替换关键词
    dedecms首页调用的简介一直修改不了是自动文章摘要在作怪
    如何进行微信营销?玩转微信公众平台营销理论手册
    用了那么久居然没发现firefox快捷键有如此多
    保护隐私:清除cookie、禁用cookie确保安全【分享给身边的朋友吧】
    如何更改firefox默认搜索引擎?一步搞定!
    微信红包中使用的技术:AA收款+随机算法
    马年添加一下马蹄印记统计(网站统计)
    今天上完就放假了,马年见
    三种dedecms调用相关文章的方法
  • 原文地址:https://www.cnblogs.com/hellenism/p/3680470.html
Copyright © 2020-2023  润新知