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系统对图片资源管理造成的,具体新情况得重新写一篇笔记

[Android学习笔记]Bitmap,BitmapDrawable,BitmapFactory学习笔记的更多相关文章

  1. android图像与图像处理系列(一、Bitmap和BitmapFactory)

    1.Drawable对象 Android应用添加了Drawabe资源之后,Android SDK会为这份资源文件在R清单文件中创建一个索引项:R.drawable.file_name,接着我们可以在x ...

  2. Android Bitmap和Canvas学习笔记 [转]

    原文:http://www.cnblogs.com/feisky/archive/2010/01/10/1643460.html 位图是我们开发中最常用的资源,毕竟一个漂亮的界面对用户是最有吸引力的. ...

  3. Android Bitmap和Canvas学习笔记

    位图是我们开发中最常用的资源,毕竟一个漂亮的界面对用户是最有吸引力的. 1. 从资源中获取位图 可以使用BitmapDrawable或者BitmapFactory来获取资源中的位图. 当然,首先需要获 ...

  4. Android NDK开发及OpenCV初步学习笔记

    https://www.jianshu.com/p/c29bb20908da Android NDK开发及OpenCV初步学习笔记 Super_圣代 关注 2017.08.19 00:55* 字数 6 ...

  5. Android M Permission 运行时权限 学习笔记

    Android M Permission 运行时权限 学习笔记 从Android 6.0开始, 用户需要在运行时请求权限, 本文对运行时权限的申请和处理进行介绍, 并讨论了使用运行时权限时新老版本的一 ...

  6. Android学习之——图形图像处理(Bitmap、BitmapFactory)(一)

    转载自http://blog.csdn.net/csxwc/article/details/10345235 Bitmap是Android系统中的图像处理的最重要的类之一.用它可以获取图像文件信息,对 ...

  7. web前端学习(三)css学习笔记部分(8)-- SVN的介绍和应用、CSS动画效果、CSS3布局属性全接触

    15.SVN的介绍和应用 15.1.SVN的介绍和应用课程概要 将代码进行集中管理,有版本号的进行迭代,方便集体工作的build流程 15.2.SVN的介绍 SVN是Subversion的简称,是一个 ...

  8. web前端学习(二)html学习笔记部分(1) -- html5新增的元素及特性等等

    检查,在浏览器中可以调整设备类型 html5实现水池效果. lang:en为英文语言,中文语言zh <html lang="en"> <head> < ...

  9. 跟着鸟哥学Linux系列笔记3-第11章BASH学习

    跟着鸟哥学Linux系列笔记0-扫盲之概念 跟着鸟哥学Linux系列笔记0-如何解决问题 跟着鸟哥学Linux系列笔记1 跟着鸟哥学Linux系列笔记2-第10章VIM学习 认识与学习bash 1. ...

随机推荐

  1. 高级特性(7)- 高级AWT

    7.1 绘图操作流程7.2 形状7.3 区域7.4 笔划7.5 着色7.6 坐标变换7.7 剪切7.8 透明与组合7.9 绘图提示7.10 图像的读取器和写入器 7.10.1 获得图像文件类型的读取器 ...

  2. 黑马day16 jquery&amp;层次选择器

    假设想通过DOM元素之间的层次关系来获取特定元素,比如后代元素,子元素,相邻元素,兄弟元素等,则须要使用层次选择器. 1 .ancestor descendant 使用方法: $("form ...

  3. android 中webview调用js

    1.android中利用webview调用网页上的js代码. Android 中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设置为true ...

  4. JVM类加载过程学习总结

    JVM类加载过程学习总结 先不说JVM类加载的原理,先看实例: NormalTest类,包含了一个静态代码块,执行的任务就是打印一句话. /** * 在正常类加载条件下,看静态代码块是否会执行 * @ ...

  5. RFS的web自动化验收测试——第14讲 万能的evaluate

    引言:什么是RFS——RobotFramework+Selenium2library,本系列主要介绍web自动化验收测试方面. ( @齐涛-道长 新浪微博) 这一讲我们重点来介绍一下一个常用的关键字e ...

  6. window.name 跨域

    跨域的由来 JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.但是我们常常会遇到无法避免跨域的情况,如普通文章站点(article.xxx.com)需要评论,而评论站点却在chea ...

  7. 实现长按删除QListWidget的Item

    原地址:http://blog.sina.com.cn/s/blog_5c70dfc80100r99u.html 要想长按删除QListWidget的Item,必须重写鼠标事件,所以需要继承QList ...

  8. 单选按钮易忽略的Group属性

    Group就其意思就是一组的意思.就是说用于选择多个控件组合,选了TRUE后,你就可以为这组新建一个变量.把一组控件当一个控件来使用.例如多个单选按钮用group属性,这样你就可以用一个变量来管理这些 ...

  9. TCP/IP笔记 一.综述

    1. TCP/IP分层 TCP/IP 是四层的体系结构:应用层.运输层.网际层和网络接口层,如下图: OSI协议是国际标准的网络协议,但是由于OSI的实用性等问题造成OSI没有流行起来.目前国际上广泛 ...

  10. 使用BigDecimal来进行精确计算

    在一些以金融等行业中的计算是需要十分精确的,即使我们使用像double这样的类型,由于浮点数的原因,会使得数据计算变得不精确,例如下面的例子: double a = 0.1; double b = 0 ...