Android 使用Matrix对Bitmap进行处理

Android中使用Matrix对图像进行缩放、旋转、平移、斜切等变换的。Matrix是一个3*3的矩阵,其值对应如下:下面给出具体坐标对应变形的属性

|scaleX, skewX, translateX| 
|skewY, scaleY, translateY|
         |0 ,0 , scale |                       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方向上的倾斜比例。

以上的set方法,均有对应的post和pre方法,Matrix调用一系列set,pre,post方法时,可视为将这些方法插入到一个队列.当然,按照队列中从头至尾的顺序调用执行.其中pre表示在队头插入一个方法,post表示在队尾插入一个方法.而set表示把当前队列清空,并且总是位于队列的最中间位置.当执行了一次set后:pre方法总是插入到set前部的队列的最前面,post方法总是插入到set后部的队列的最后面Demo

Bitmap bitmap = null;
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.lena);


* 缩小
@Click
void btn1() {
Matrix matrix = new Matrix();
matrix.setScale(0.5f, 0.5f);
Bitmap bm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
bitmap.getHeight(), matrix, true);
iv2.setImageBitmap(bm);
showToast(matrix);
}

/**
* 先缩小后旋转
*/
@Click
void btn2() {
Matrix matrix = new Matrix();
matrix.setScale(0.5f, 0.5f);// 缩小为原来的一半
matrix.postRotate(45.0f);// 旋转45度 == matrix.setSinCos(0.5f, 0.5f);
Bitmap bm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
bitmap.getHeight(), matrix, true);
iv2.setImageBitmap(bm);
showToast(matrix);
}


/**
* 平移
*/
@Click
void btn3() {
Matrix matrix = new Matrix();
matrix.setTranslate(bitmap.getWidth() / 2, bitmap.getHeight() / 2);// 向左下平移
Bitmap bm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
bitmap.getHeight(), matrix, true);
iv2.setImageBitmap(bm);
showToast(matrix);
}


* /**

* 斜切
*/
@Click
void btn4() {
Matrix matrix = new Matrix();
matrix.setSkew(0.5f, 0.5f);// 斜切
matrix.postScale(0.5f, 0.5f);// 缩小为原来的一半

Bitmap bm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
bitmap.getHeight(), matrix, true);
iv2.setImageBitmap(bm);
showToast(matrix);
}

/**
* 相当于自由变换
* 由一个矩形变成四边形
*/
@Click
void btn5() {
Matrix matrix = new Matrix();

float[] src = new float[] { 0, 0, // 左上
bitmap.getWidth(), 0,// 右上
bitmap.getWidth(), bitmap.getHeight(),// 右下
0, bitmap.getHeight() };// 左下

float[] dst = new float[] { 0, 0,
bitmap.getWidth(), 30,
bitmap.getWidth(), bitmap.getHeight() - 30,
0,bitmap.getHeight() };
matrix.setPolyToPoly(src, 0, dst, 0, src.length/2);
Bitmap bm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
bitmap.getHeight(), matrix, true);

iv2.setImageBitmap(bm);

showToast(matrix);
}


/**
* 显示矩阵中的值
* @param matrix
*/
@UiThread
void showToast(Matrix matrix) {
String string = "";
float[] values = new float[9];
matrix.getValues(values);
for (int i = 0; i < values.length; i++) {
string += "matrix.at" + i + "=" + values[i];
}
Toast.makeText(this, string, Toast.LENGTH_SHORT).show();
Log.d("TEST", string);
}
}



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值