转载自http://blog.csdn.net/csxwc/article/details/10345235

Bitmap是Android系统中的图像处理的最重要的类之一。用它可以获取图像文件信息,对图像进行旋转,剪切,放大,缩小等操作。

Bitmap代表一张位图,使我们在开发中常用的资源,下面就对Bitmap进行简单的介绍。

Bitmap的获取方法:

1、使用BitmapDrawable

BitmapDrawable里封装的图片就是一个Bitmap对象,我们要把Bitmap包装成BitmapDrawable对象,可以调用BitmapDrawable的构造方法:
BItmapDrawbale drawable = new BItmapDrawable(bitmap);
如果要获取BitmapDrawable所包装的Bitmap对象,则可调用BitmapDrawable的getBitmap()方法:
Bitmap bitmap = drawbale.getBitmap();

2、Bitmap提供了一些静态方法来创建Bitmap对象(仅列举几个):

  • createBitmap(Bitmap source,int x,int y,int width,int height):从原位图source的指定坐标(x,y)开始,从中挖取宽width,高heigtht的一块出来,创建新的Bitmap对象。
  • createScaledBitmap(Bitmap source,int width,ing height,boolean fliter):对源位图进行缩放,缩放称宽width,高heigth的新位图。
  • createBitmap(int width,int height,Bitmap.Config config):创建一个宽width,高height的可变的新位图。
  • createBitmap(Bitmap source, int x,int y,int width,int height ,Matrix m,boolean fliter):从源位图source的指定坐标(x,y)开始,挖取宽width,高height的一块来,创建新的Bitmap对象,并按照Matrix指定的规则进行变换。

3、通过对资源文件的解析获取Bitmap对象,在这里就要用到BitmapFactory这个工具类,提供的方法如下:

  • decodeByteArray(byte[] data, int offset,int length):从指定字节数组的offset位置开始,将长度为length的字节数据解析成Bitmap对象。
  • decodeFIle(String pathName):从pathName指定的文件中解析、创建Bitmap对象。
  • decodeFileDescriptor(FileDescriptor fd):用于从FileDescriptor对应的文件中解析、创建Bitmap对象。
  • decodeResource(Resource res,int id):用于根据给定的资源ID从指定的资源文件中解析、创建Bitmap对象。
  • decodeStream(InputStream is):用于从指定输入流中介解析、创建Bitmap对象。
但是,在系统不断的解析、创建Bitmap的过程中,可能会由于内存小或其他原因,导致程序运行时发生OutOfMemory错误。
为此,Android为Bitmap提供了内存回收方法:
void recycle():强制回收Bitmap对象。
还有用于判断Bitmap 对象是否被回收的方法:
boolean isRecycle();
 
如果Android应用需要访问系统相册,都需要借助BitmapFactory解析、创建Bitmap对象。点击打开链接这篇文章对此略有涉及。
 
下面是对Bitmap、BitmapFactory的简单应用。
 
介绍:对assets目录下的图片资源进行查看。
由于布局文件很简单,在此不给出,源码如下:

public class MainActivity extends Activity {

String[] images = null;
//获取访问assets文件的对象
AssetManager assets = null;
int currentImg = 0;
ImageView img;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

img = (ImageView) findViewById(R.id.img_show);
try {
//获取访问assets下文件的对象
assets = getAssets();
images = assets.list("");
} catch (Exception e) {
e.printStackTrace();
}

Button btn_next = (Button) findViewById(R.id.btn_next);
btn_next.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
//如果角标越界
if(currentImg>=images.length){
currentImg = 0;

}
//找到下一张图片
while(!images[currentImg].endsWith(".jpg")){
currentImg++;
if(currentImg>=images.length){
currentImg = 0;
}
}
InputStream assetFile = null;

try {
//打开指定资源对应的输入流
assetFile = assets.open(images[currentImg++]);
} catch (Exception e) {
e.printStackTrace();
}

//回收图片
BitmapDrawable bitmapDrawable = (BitmapDrawable) img.getDrawable();
if(bitmapDrawable!=null&&!bitmapDrawable.getBitmap().isRecycled()){
bitmapDrawable.getBitmap().recycle();
}

//显示图片
img.setImageBitmap(BitmapFactory.decodeStream(assetFile));
}
});
}

另外,在一些游戏中不断移动的背景,比如经典的“雷电”飞机游戏,通过不断的挖取背景图片的一部分,给人感官上造成飞机不断移动的错觉。可以通过createBitmap(Bitmap bitmap,int x,int y,int width,int height)方法来实现。
如下:

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MyView(this));
}

class MyView extends View{

//记录背景位图的实际高度
final int BACK_HEIGHT = 1700;
//背景图片
private Bitmap back;
private Bitmap plane;

//背景图片的开始位置
final int WIDTH = 320;
final int HEIGHT = 440;

private int startY = BACK_HEIGHT -HEIGHT;

public MyView(Context context) {
super(context);

back = BitmapFactory.decodeResource(context.getResources(), R.drawable.back_img);

plane = BitmapFactory.decodeResource(context.getResources(), R.drawable.plane);

final Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {

if(msg.what ==0x123){
//重新开始移动
if(startY<=0){
startY = BACK_HEIGHT - HEIGHT;
}
else
startY -= 3;
}
invalidate();
}
};
new Timer().schedule(new TimerTask() {

@Override
public void run() {
mHandler.sendEmptyMessage(0x123);
}
}, 0,100);

}
@Override
protected void onDraw(Canvas canvas) {
//根据原始位图和Matrix创建新的图片
Bitmap bitmap_2 = Bitmap.createBitmap(back, 0, startY, WIDTH, HEIGHT);

//绘制新位图
canvas.drawBitmap(bitmap_2, 0,0,null);

//绘制飞机
canvas.drawBitmap(plane, 160, 380,null);
}

}

}

//一些图形效果

Matrix matrix = new Matrix();

//镜面效果
matrix.setScale(-1, 1);
matrix.postTranslate(bitmap.getWidth(), 0);

//倒影效果
matrix.setScale(1, -1);
matrix.postTranslate(0, bitmap.getHeight());

//图片合成的效果(android.graphics.PorterDuff.Mode)

//设置重叠部分的效果
paint.setXfermode(new PorterDuffXfermode(android.graphics.PorterDuff.Mode.DST_ATOP));

canvas.drawBitmap(bitmapa, new Matrix(), paint);

canvas.drawBitmap(bitmapb, new Matrix(),paint);

android.graphics.PorterDuff.Mode的一些取值

1.PorterDuff.Mode.CLEAR
所绘制不会提交到画布上。

2.PorterDuff.Mode.SRC
显示上层绘制图片

3.PorterDuff.Mode.DST
显示下层绘制图片

4.PorterDuff.Mode.SRC_OVER
正常绘制显示,上下层绘制叠盖。

5.PorterDuff.Mode.DST_OVER
上下层都显示。下层居上显示。

6.PorterDuff.Mode.SRC_IN
取两层绘制交集。显示上层。

7.PorterDuff.Mode.DST_IN
取两层绘制交集。显示下层。

8.PorterDuff.Mode.SRC_OUT
取上层绘制非交集部分。

9.PorterDuff.Mode.DST_OUT
取下层绘制非交集部分。

10.PorterDuff.Mode.SRC_ATOP
取下层非交集部分与上层交集部分

11.PorterDuff.Mode.DST_ATOP
取上层非交集部分与下层交集部分

12.PorterDuff.Mode.XOR
取两层绘制非交集。两层绘制非交集。

13.PorterDuff.Mode.DARKEN
上下层都显示。变暗

14.PorterDuff.Mode.LIGHTEN
上下层都显示。变量

15.PorterDuff.Mode.MULTIPLY
取两层绘制交集

16.PorterDuff.Mode.SCREEN
上下层都显示。

Android学习之——图形图像处理(Bitmap、BitmapFactory)(一)的更多相关文章

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

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

  2. Android学习笔记之BitmapFactory.Options实现图片资源的加载...

    PS:小项目总算是做完了...历经20多天...素材,设计,以及实现全由自己完成...心力憔悴啊...该写写博客记录一下学习到的东西了... 学习内容: 1.使用BitmapFactory.Optio ...

  3. 【Android】21.2 2D图形图像处理(Canvas和Paint)

    分类:C#.Android.VS2015: 创建日期:2016-03-19 一.Canvas对象简介 画布(Canvas对象)是与System.Drawing或iOS核心图形等传统框架非常类似的另一种 ...

  4. Android学习之BitMap用法实例

    下面简单说明了BitMap的用法: 从服务器下载一张图片,显示在ImageView控件上,并将该图片保存在移动设备的SD上. // 根据网络URL获取输入流 public InputStream ge ...

  5. Android学习笔记_42_各种图形的炫酷效果的实现和使用

    一.文档位置: 这里在android中的图形,在帮助文档的这个页面,  android-sdk-windows\docs\guide\topics\resources\drawable-resourc ...

  6. Android学习之利用BitmapFactory工厂压缩图片

    BufferedInputStream in = new BufferedInputStream( new FileInputStream(new File(path))); BitmapFactor ...

  7. Android学习笔记进阶18 之画图并保存图片到本地

    1.首先创建一个Bitmap图片,并指定大小:   2.在该图片上创建一个新的画布Canvas,然后在画布上绘制,并保存即可:   3.需要保存的目录File,注意如果写的目录如“/sdcard/so ...

  8. Android学习笔记进阶18之画图并保存图片到本地

    1.首先创建一个Bitmap图片,并指定大小:   2.在该图片上创建一个新的画布Canvas,然后在画布上绘制,并保存即可:   3.需要保存的目录File,注意如果写的目录如“/sdcard/so ...

  9. Android菜鸟成长记15 -- BitMap

    BitMap简介 Bitmap是Android系统中的图像处理的最重要类之一.用它可以获取图像文件信息,进行图像剪切.旋转.缩放等操作,并可以指定格式保存图像文件.本文从应用的角度,着重介绍怎么用Bi ...

随机推荐

  1. linux 下安装apache 快速教程

    最近自学linux,看鸟哥的文章.提到了apache,所以在虚拟机redhat 5下安装了一把, 结合国内外文章写下快速可行的教程: --------------------------------- ...

  2. 解决安装SQL Server2008失败的问题

    安装SQL Server2008时遇到"2008安装错误  必须重新启动计算机才能安装 SQL Server". 解决办法:HKEY_LOCAL_MACHINE\SYSTEM\Cu ...

  3. hibernate AOP

    摘自:http://pandonix.iteye.com/blog/336873/ 此前对于AOP的使用仅限于声明式事务,除此之外在实际开发中也没有遇到过与之相关的问题.最近项目中遇到了以下几点需求, ...

  4. linux中crontab实现以秒执行任务

    用crontab+sleep实现以秒执行任务 crontab -e * * * * * /bin/date >>/tmp/date.txt * * * * * sleep 10s; /bi ...

  5. 【转】一个安全测试的CheckList

    转自:http://hi.baidu.com/dontcry/item/90c2bc466558c217886d1075 不登录系统,直接输入登录后的页面的URL是否可以访问: 不登录系统,直接输入下 ...

  6. 方法字段[C# 基础知识系列]专题二:委托的本质论

    首先声明,我是一个菜鸟.一下文章中出现技术误导情况盖不负责 引言: 上一个专题已和大家分享了我懂得的——C#中为什么须要委托,专题中简略介绍了下委托是什么以及委托简略的应用的,在这个专题中将对委托做进 ...

  7. ListView删除选中的多项目

    //ListView删除选中的多项目function DeleteMultSelItems(ListView:TListView):Boolean;var  I: Integer;begin  Res ...

  8. 以C#编写的Socket服务器的Android手机聊天室Demo

    内容摘要 1.程序架构 2.通信协议 3.服务器源代码 4.客户端源代码 5.运行效果 一.程序架构 在开发一个聊天室程序时,我们可以使用Socket.Remoting.WCF这些具有双向通信的协议或 ...

  9. 图解JS原型链

    一:任何一个对象都有一个prototype的属性,在js中可以把它记为:__proto__ 当初ECMAscript的发明者为了简化这门语言,同时又保持继承的属性,于是就设计了这个链表.. 在数据结构 ...

  10. python 学习(一)

    python的基础看完了之后,有点像简化并提供了一定优化后的java基础,看java多了的人看python还是比较别扭的.看完别人对于java和python的对比,我只能感慨一句,还有什么是java办 ...