图像色彩变化----矩阵法和像素点法
图像变换----矩阵法与像素块法
图像变换----画笔风格法
矩阵变换
|A B C|
|D E F|
|G H I |
A、E控制缩放
C、F控制平移
B、D控制错切
在onCreate中无法获取宽高
ImageMatrixView.java
public class ImageMatrixView extends View {
private Bitmap mBitmap;
private Matrix mMatrix;
public ImageMatrixView(Context context) {
super(context);
initView();
}
public ImageMatrixView(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
public ImageMatrixView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView();
}
private void initView() {
mBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
setImageMatrix(new Matrix());
}
public void setImageMatrix(Matrix matrix) {
mMatrix = matrix;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//原图
canvas.drawBitmap(mBitmap, 0, 0, null);
//对比图
canvas.drawBitmap(mBitmap, mMatrix, null);
}
}
matrix.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.example.imagedemo02.ImageMatrixView
android:id="@+id/view"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2" />
<GridLayout
android:id="@+id/grid_group"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_gravity="center_horizontal"
android:layout_weight="3"
android:columnCount="3"
android:rowCount="3"></GridLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="change"
android:text="Change"/>
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:onClick="reset"
android:text="Reset"/>
</LinearLayout>
</LinearLayout>
矩阵变换----Android API
matrix.setRotate()----旋转
matrix.setTranslate()----平移
matrix.setScale()----缩放
matrix.setSkew()----错切
post----矩阵组合
ImageMatrixTest.java
public class ImageMatrixTest extends Activity {
private GridLayout mGridLayout;
private ImageMatrixView mImageMatrixView;
private int mEdWidth;
private int mEdHeight;
private float[] mImageMatrix = new float[9];
private EditText[] mEts = new EditText[9];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.matrix);
mImageMatrixView = (ImageMatrixView) findViewById(R.id.view);
mGridLayout = (GridLayout) findViewById(R.id.grid_group);
mGridLayout.post(new Runnable() {
@Override
public void run() {
mEdWidth = mGridLayout.getWidth() / 3;
mEdHeight = mGridLayout.getHeight() / 3;
addEts();
initImageMatrix();
}
});
}
private void addEts() {
for (int i = 0; i < 9; i++) {
EditText et = new EditText(ImageMatrixTest.this);
//居中显示
et.setGravity(Gravity.CENTER);
mEts[i] = et;
mGridLayout.addView(et, mEdWidth, mEdHeight);
}
}
/**
* 初始矩阵
* 1 0 0
* 0 1 0
* 0 0 1
*/
private void initImageMatrix() {
for (int i = 0; i < 9; i++) {
if (i % 4 == 0) {
mEts[i].setText(String.valueOf(1));
} else {
mEts[i].setText(String.valueOf(0));
}
}
}
private void getImageMatrix() {
for (int i = 0; i < 9; i++) {
EditText ed = mEts[i];
mImageMatrix[i] = Float.parseFloat(ed.getText().toString());
}
}
public void change(View view) {
getImageMatrix();
Matrix matrix = new Matrix();
// matrix.setValues(mImageMatrix);
// //X轴偏移量,Y轴偏移量
// matrix.setTranslate(150, 150);
matrix.setScale(2, 2);
matrix.postTranslate(200, 200);
//矩阵先乘和后乘是不一样的
mImageMatrixView.setImageMatrix(matrix);
mImageMatrixView.invalidate();
}
public void reset(View view) {
initImageMatrix();
getImageMatrix();
Matrix matrix = new Matrix();
matrix.setValues(mImageMatrix);
mImageMatrixView.setImageMatrix(matrix);
mImageMatrixView.invalidate();
}
}