Matrix的对图像的处理可分为四类基本变换:
<span style="font-size:13px;"></span><pre name="code" class="java">package compattesttransformmatrix;import androidappActivity; import androidcontentContext; import androidgraphicsBitmap; import androidgraphicsBitmapFactory; import androidgraphicsCanvas; import androidgraphicsMatrix; import androidosBundle; import androidutilLog; import androidviewMotionEvent; import androidviewView; import androidviewWindow; import androidviewWindowManager; import androidviewViewOnTouchListener; import androidwidgetImageView;public class TestTransformMatrixActivity extends Activity implements OnTouchListener { private TransformMatrixView view; @Override public void onCreate(Bundle savedInstanceState) { superonCreate(savedInstanceState); requestWindowFeature(WindowFEATURE_NO_TITLE); thisgetWindow()setFlags(WindowManagerLayoutParamsFLAG_FULLSCREEN, WindowManagerLayoutParamsFLAG_FULLSCREEN);view = new TransformMatrixView(this); viewsetScaleType(ImageViewScaleTypeMATRIX); viewsetOnTouchListener(this);setContentView(view); }class TransformMatrixView extends ImageView { private Bitmap bitmap; private Matrix matrix; public TransformMatrixView(Context context) { super(context); bitmap = BitmapFactorydecodeResource(getResources(), Rdrawablesophie); matrix = new Matrix(); }@Override protected void onDraw(Canvas canvas) { // 画出原图像 canvasdrawBitmap(bitmap, 0, 0, null); // 画出变换后的图像 canvasdrawBitmap(bitmap, matrix, null); superonDraw(canvas); }@Override public void setImageMatrix(Matrix matrix) { thismatrixset(matrix); supersetImageMatrix(matrix); }public Bitmap getImageBitmap() { return bitmap; } }public boolean onTouch(View v, MotionEvent e) { if(egetAction() == MotionEventACTION_UP) { Matrix matrix = new Matrix(); // 输出图像的宽度和高度(162 x 251) Loge("TestTransformMatrixActivity", "image size: width x height = " + viewgetImageBitmap()getWidth() + " x " + viewgetImageBitmap()getHeight()); // 平移 matrixpostTranslate(viewgetImageBitmap()getWidth(), viewgetImageBitmap()getHeight()); // 在x方向平移viewgetImageBitmap()getWidth(),在y轴方向viewgetImageBitmap()getHeight() viewsetImageMatrix(matrix);// 下面的代码是为了查看matrix中的元素 float[] matrixValues = new float[9]; matrixgetValues(matrixValues); for(int i = 0; i < 3; ++i) { String temp = new String(); for(int j = 0; j < 3; ++j) { temp += matrixValues[3 * i + j ] + " "; } Loge("TestTransformMatrixActivity", temp); } // // 旋转(围绕图像的中心点) // matrixsetRotate(45f, viewgetImageBitmap()getWidth() / 2f, viewgetImageBitmap()getHeight() / 2f); //// // 做下面的平移变换,纯粹是为了让变换后的图像和原图像不重叠 // matrixpostTranslate(viewgetImageBitmap()getWidth() * 5f, 0f); // viewsetImageMatrix(matrix); // // // 下面的代码是为了查看matrix中的元素 // float[] matrixValues = new float[9]; // matrixgetValues(matrixValues); // for(int i = 0; i < 3; ++i) // { // String temp = new String(); // for(int j = 0; j < 3; ++j) // { // temp += matrixValues[3 * i + j ] + " "; // } // Loge("TestTransformMatrixActivity", temp); // } // // 旋转(围绕坐标原点) + 平移(效果同2) // matrixsetRotate(45f); // matrixpreTranslate(-1f * viewgetImageBitmap()getWidth() / 2f, -1f * viewgetImageBitmap()getHeight() / 2f); // matrixpostTranslate((float)viewgetImageBitmap()getWidth() / 2f, (float)viewgetImageBitmap()getHeight() / 2f); //// // 做下面的平移变换,纯粹是为了让变换后的图像和原图像不重叠 // matrixpostTranslate((float)viewgetImageBitmap()getWidth() * 5f, 0f); // viewsetImageMatrix(matrix); //// // 下面的代码是为了查看matrix中的元素 // float[] matrixValues = new float[9]; // matrixgetValues(matrixValues); // for(int i = 0; i < 3; ++i) // { // String temp = new String(); // for(int j = 0; j < 3; ++j) // { // temp += matrixValues[3 * i + j ] + " "; // } // Loge("TestTransformMatrixActivity", temp); // }// // 缩放 // matrixsetScale(2f, 2f); // // 下面的代码是为了查看matrix中的元素 // float[] matrixValues = new float[9]; // matrixgetValues(matrixValues); // for(int i = 0; i < 3; ++i) // { // String temp = new String(); // for(int j = 0; j < 3; ++j) // { // temp += matrixValues[3 * i + j ] + " "; // } // Loge("TestTransformMatrixActivity", temp); // } //// // 做下面的平移变换,纯粹是为了让变换后的图像和原图像不重叠 // matrixpostTranslate(viewgetImageBitmap()getWidth(), viewgetImageBitmap()getHeight()); // viewsetImageMatrix(matrix); //// // 下面的代码是为了查看matrix中的元素 // matrixValues = new float[9]; // matrixgetValues(matrixValues); // for(int i = 0; i < 3; ++i) // { // String temp = new String(); // for(int j = 0; j < 3; ++j) // { // temp += matrixValues[3 * i + j ] + " "; // } // Loge("TestTransformMatrixActivity", temp); // } // // 错切 - 水平 // matrixsetSkew(5f, 0f); // // 下面的代码是为了查看matrix中的元素 // float[] matrixValues = new float[9]; // matrixgetValues(matrixValues); // for(int i = 0; i < 3; ++i) // { // String temp = new String(); // for(int j = 0; j < 3; ++j) // { // temp += matrixValues[3 * i + j ] + " "; // } // Loge("TestTransformMatrixActivity", temp); // } //// // 做下面的平移变换,纯粹是为了让变换后的图像和原图像不重叠// matrixpostTranslate(viewgetImageBitmap()getWidth(), 0f); // viewsetImageMatrix(matrix); //// // 下面的代码是为了查看matrix中的元素 // matrixValues = new float[9]; // matrixgetValues(matrixValues); // for(int i = 0; i < 3; ++i) // { // String temp = new String(); // for(int j = 0; j < 3; ++j) // { // temp += matrixValues[3 * i + j ] + " "; // } // Loge("TestTransformMatrixActivity", temp); // }// // 错切 - 垂直 // matrixsetSkew(0f, 5f); // // 下面的代码是为了查看matrix中的元素 // float[] matrixValues = new float[9]; // matrixgetValues(matrixValues); // for(int i = 0; i < 3; ++i) // { // String temp = new String(); // for(int j = 0; j < 3; ++j) // { // temp += matrixValues[3 * i + j ] + " "; // } // Loge("TestTransformMatrixActivity", temp); // } //// // 做下面的平移变换,纯粹是为了让变换后的图像和原图像不重叠// matrixpostTranslate(0f, viewgetImageBitmap()getHeight()); // viewsetImageMatrix(matrix); //// // 下面的代码是为了查看matrix中的元素 // matrixValues = new float[9]; // matrixgetValues(matrixValues); // for(int i = 0; i < 3; ++i) // { // String temp = new String(); // for(int j = 0; j < 3; ++j) // { // temp += matrixValues[3 * i + j ] + " "; // } // Loge("TestTransformMatrixActivity", temp); // }//错切 - 水平 + 垂直 // matrixsetSkew(5f, 5f); // // 下面的代码是为了查看matrix中的元素 // float[] matrixValues = new float[9]; // matrixgetValues(matrixValues); // for(int i = 0; i < 3; ++i) // { // String temp = new String(); // for(int j = 0; j < 3; ++j) // { // temp += matrixValues[3 * i + j ] + " "; // } // Loge("TestTransformMatrixActivity", temp); // } //// // 做下面的平移变换,纯粹是为了让变换后的图像和原图像不重叠// matrixpostTranslate(0f, viewgetImageBitmap()getHeight()); // viewsetImageMatrix(matrix); //// // 下面的代码是为了查看matrix中的元素 // matrixValues = new float[9]; // matrixgetValues(matrixValues); // for(int i = 0; i < 3; ++i) // { // String temp = new String(); // for(int j = 0; j < 3; ++j) // { // temp += matrixValues[3 * i + j ] + " "; // } // Loge("TestTransformMatrixActivity", temp); // }// // 对称 (水平对称) // float matrix_values[] = {1f, 0f, 0f, 0f, -1f, 0f, 0f, 0f, 1f}; // matrixsetValues(matrix_values); // // 下面的代码是为了查看matrix中的元素 // float[] matrixValues = new float[9]; // matrixgetValues(matrixValues); // for(int i = 0; i < 3; ++i) // { // String temp = new String(); // for(int j = 0; j < 3; ++j) // { // temp += matrixValues[3 * i + j ] + " "; // } // Loge("TestTransformMatrixActivity", temp); // } //// // 做下面的平移变换,纯粹是为了让变换后的图像和原图像不重叠// matrixpostTranslate(0f, viewgetImageBitmap()getHeight() * 2f); // viewsetImageMatrix(matrix); //// // 下面的代码是为了查看matrix中的元素 // matrixValues = new float[9]; // matrixgetValues(matrixValues); // for(int i = 0; i < 3; ++i) // { // String temp = new String(); // for(int j = 0; j < 3; ++j) // { // temp += matrixValues[3 * i + j ] + " "; // } // Loge("TestTransformMatrixActivity", temp); // }// // 对称 - 垂直 // float matrix_values[] = {-1f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 1f}; // matrixsetValues(matrix_values); // // 下面的代码是为了查看matrix中的元素 // float[] matrixValues = new float[9]; // matrixgetValues(matrixValues); // for(int i = 0; i < 3; ++i) // { // String temp = new String(); // for(int j = 0; j < 3; ++j) // { // temp += matrixValues[3 * i + j ] + " "; // } // Loge("TestTransformMatrixActivity", temp); // } //// // 做下面的平移变换,纯粹是为了让变换后的图像和原图像不重叠// matrixpostTranslate(viewgetImageBitmap()getWidth() * 2f, 0f); // viewsetImageMatrix(matrix); //// // 下面的代码是为了查看matrix中的元素 // matrixValues = new float[9]; // matrixgetValues(matrixValues); // for(int i = 0; i < 3; ++i) // { // String temp = new String(); // for(int j = 0; j < 3; ++j) // { // temp += matrixValues[3 * i + j ] + " "; // } // Loge("TestTransformMatrixActivity", temp); // } // // 对称(对称轴为直线y = x) // float matrix_values[] = {0f, -1f, 0f, -1f, 0f, 0f, 0f, 0f, 1f}; // matrixsetValues(matrix_values); // // 下面的代码是为了查看matrix中的元素 // float[] matrixValues = new float[9]; // matrixgetValues(matrixValues); // for(int i = 0; i < 3; ++i) // { // String temp = new String(); // for(int j = 0; j < 3; ++j) // { // temp += matrixValues[3 * i + j ] + " "; // } // Loge("TestTransformMatrixActivity", temp); // } //// // 做下面的平移变换,纯粹是为了让变换后的图像和原图像不重叠// matrixpostTranslate(viewgetImageBitmap()getHeight() + viewgetImageBitmap()getWidth(),// viewgetImageBitmap()getHeight() + viewgetImageBitmap()getWidth()); // viewsetImageMatrix(matrix); //// // 下面的代码是为了查看matrix中的元素 // matrixValues = new float[9]; // matrixgetValues(matrixValues); // for(int i = 0; i < 3; ++i) // { // String temp = new String(); // for(int j = 0; j < 3; ++j) // { // temp += matrixValues[3 * i + j ] + " "; // } // Loge("TestTransformMatrixActivity", temp); // }viewinvalidate(); } return true; } }下面给出上述代码中,各种变换的具体结果及其对应的相关变换矩阵
matrix.setRotate(45f,view.getImageBitmap().getWidth() / 2f, view.getImageBitmap().getHeight() / 2f);matrix.postTranslate(view.getImageBitmap().getWidth()* 1.5f, 0f);这两条语句综合作用的结果。根据第一部分中“二、旋转变换”里面关于围绕某点旋转的公式,
matrix.setRotate(45f,view.getImageBitmap().getWidth() / 2f, view.getImageBitmap().getHeight() / 2f);所产生的转换矩阵就是:
matrix.setRotate(45f,view.getImageBitmap().getWidth() / 2f, view.getImageBitmap().getHeight() / 2f);等价于
matrix.setRotate(45f);matrix.preTranslate(-1f* view.getImageBitmap().getWidth() / 2f, -1f *view.getImageBitmap().getHeight() / 2f);matrix.postTranslate((float)view.getImageBitmap().getWidth()/ 2f, (float)view.getImageBitmap().getHeight() / 2f);其中matrix.setRotate(45f)对应的矩阵是:
matrix.setRotate(45f);matrix.preTranslate(-1f* view.getImageBitmap().getWidth() / 2f, -1f *view.getImageBitmap().getHeight() / 2f);matrix.postTranslate((float)view.getImageBitmap().getWidth()/ 2f, (float)view.getImageBitmap().getHeight() / 2f);对应的矩阵就是: