您的位置:首页 > 移动开发 > Android开发

承香墨影 Android--Matrix图片变换处理

2016-04-15 18:44 483 查看
承香墨影

Android--Matrix图片变换处理

前言

  本篇博客主要讲解一下如何处理对一个Bitmap对象进行处理,包括:缩放、旋转、位移、倾斜等。在最后将以一个简单的Demo来演示图片特效的变换。

  本篇博客的主要内容:

Matrix

Matrix缩放

Matrix旋转

Matrix位移

Matrix倾斜

Matrix变换注意事项

Matrix完整的Demo

Matrix

  对于一个图片变换的处理,需要Matrix类的支持,它位于"android.graphics.Matrix"包下,是Android提供的一个矩阵工具类,它本身不能对图像或View进行变换,但它可与其他API结合来控制图形、View的变换,如Canvas。

  Matrix提供了一些方法来控制图片变换:

setTranslate(float dx,float dy):控制Matrix进行位移。

setSkew(float kx,float ky):控制Matrix进行倾斜,kx、ky为X、Y方向上的比例。

setSkew(float kx,float ky,float px,float py):控制Matrix以px、py为轴心进行倾斜,kx、ky为X、Y方向上的倾斜比例。

setRotate(float degrees):控制Matrix进行depress角度的旋转,轴心为(0,0)。

setRotate(float degrees,float px,float py):控制Matrix进行depress角度的旋转,轴心为(px,py)。

setScale(float sx,float sy):设置Matrix进行缩放,sx、sy为X、Y方向上的缩放比例。

setScale(float sx,float sy,float px,float py):设置Matrix以(px,py)为轴心进行缩放,sx、sy为X、Y方向上的缩放比例。

  之前有提过,图片在内存中存放的就是一个一个的像素点,而对于图片的变换主要是处理图片的每个像素点,对每个像素点进行相应的变换,即可完成对图像的变换。上面已经列举了Matrix进行变换的常用方法,下面以几个Demo来讲解一下如何通过Matrix进行变换。

Matrix缩放

  代码:

1 package cn.bgxt.canvasmatrixdemo;
2
3 import android.os.Bundle;
4 import android.view.View;
5 import android.widget.Button;
6 import android.widget.ImageView;
7 import android.app.Activity;
8 import android.graphics.Bitmap;
9 import android.graphics.BitmapFactory;
10 import android.graphics.Canvas;
11 import android.graphics.Matrix;
12 import android.graphics.Paint;
13
14 public class MainActivity extends Activity {
15     private Button btn_scale, btn_rotate, btn_translate, btn_skew;
16     private ImageView iv_base, iv_after;
17     private Bitmap baseBitmap;
18     private Paint paint;
19
20     @Override
21     protected void onCreate(Bundle savedInstanceState) {
22         super.onCreate(savedInstanceState);
23         setContentView(R.layout.activity_main);
24
25         btn_scale = (Button) findViewById(R.id.btn_scale);
26         btn_rotate = (Button) findViewById(R.id.btn_rotate);
27         btn_translate = (Button) findViewById(R.id.btn_translate);
28         btn_skew = (Button) findViewById(R.id.btn_skew);
29
30         btn_scale.setOnClickListener(click);
31         btn_rotate.setOnClickListener(click);
32         btn_translate.setOnClickListener(click);
33         btn_skew.setOnClickListener(click);
34
35         iv_base = (ImageView) findViewById(R.id.iv_base);
36         iv_after = (ImageView) findViewById(R.id.iv_after);
37
38         baseBitmap = BitmapFactory.decodeResource(getResources(),
39                 R.drawable.ic_launcher);
40         iv_base.setImageBitmap(baseBitmap);
41
42         // 设置画笔,消除锯齿
43         paint = new Paint();
44         paint.setAntiAlias(true);
45     }
46
47     private View.OnClickListener click = new View.OnClickListener() {
48
49         @Override
50         public void onClick(View v) {
51
52             switch (v.getId()) {
53             case R.id.btn_scale:
54                 bitmapScale(2.0f, 4.0f);
55                 break;
56             case R.id.btn_rotate:
57                 bitmapRotate(180);
58                 break;
59             case R.id.btn_translate:
60                 bitmapTranslate(20f, 20f);
61                 break;
62             case R.id.btn_skew:
63                 bitmapSkew(0.2f, 0.4f);
64                 break;
65             default:
66                 break;
67             }
68
69         }
70     };
71
72     /**
73      * 缩放图片
74      */
75     protected void bitmapScale(float x, float y) {
76         // 因为要将图片放大,所以要根据放大的尺寸重新创建Bitmap
77         Bitmap afterBitmap = Bitmap.createBitmap(
78                 (int) (baseBitmap.getWidth() * x),
79                 (int) (baseBitmap.getHeight() * y), baseBitmap.getConfig());
80         Canvas canvas = new Canvas(afterBitmap);
81         // 初始化Matrix对象
82         Matrix matrix = new Matrix();
83         // 根据传入的参数设置缩放比例
84         matrix.setScale(x, y);
85         // 根据缩放比例,把图片draw到Canvas上
86         canvas.drawBitmap(baseBitmap, matrix, paint);
87         iv_after.setImageBitmap(afterBitmap);
88     }
89
90     /**
91      * 倾斜图片
92      */
93     protected void bitmapSkew(float dx, float dy) {
94         // 根据图片的倾斜比例,计算变换后图片的大小,
95         Bitmap afterBitmap = Bitmap.createBitmap(baseBitmap.getWidth()
96                 + (int) (baseBitmap.getWidth() * dx), baseBitmap.getHeight()
97                 + (int) (baseBitmap.getHeight() * dy), baseBitmap.getConfig());
98         Canvas canvas = new Canvas(afterBitmap);
99         Matrix matrix = new Matrix();
100         // 设置图片倾斜的比例
101         matrix.setSkew(dx, dy);
102         canvas.drawBitmap(baseBitmap, matrix, paint);
103         iv_after.setImageBitmap(afterBitmap);
104     }
105
106     /**
107      * 图片移动
108      */
109     protected void bitmapTranslate(float dx, float dy) {
110         // 需要根据移动的距离来创建图片的拷贝图大小
111         Bitmap afterBitmap = Bitmap.createBitmap(
112                 (int) (baseBitmap.getWidth() + dx),
113                 (int) (baseBitmap.getHeight() + dy), baseBitmap.getConfig());
114         Canvas canvas = new Canvas(afterBitmap);
115         Matrix matrix = new Matrix();
116         // 设置移动的距离
117         matrix.setTranslate(dx, dy);
118         canvas.drawBitmap(baseBitmap, matrix, paint);
119         iv_after.setImageBitmap(afterBitmap);
120     }
121
122     /**
123      * 图片旋转
124      */
125     protected void bitmapRotate(float degrees) {
126         // 创建一个和原图一样大小的图片
127         Bitmap afterBitmap = Bitmap.createBitmap(baseBitmap.getWidth(),
128                 baseBitmap.getHeight(), baseBitmap.getConfig());
129         Canvas canvas = new Canvas(afterBitmap);
130         Matrix matrix = new Matrix();
131         // 根据原图的中心位置旋转
132         matrix.setRotate(degrees, baseBitmap.getWidth() / 2,
133                 baseBitmap.getHeight() / 2);
134         canvas.drawBitmap(baseBitmap, matrix, paint);
135         iv_after.setImageBitmap(afterBitmap);
136     }
137
138 }


  

  源码下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: