矩阵乘法:
简介
在编程中有时候需要对图片做特殊的处理,比如将图片做出黑白的,或者老照片的效果,有时候还要对图片进行变换,以拉伸,扭曲等等。
这些效果在android中有很好的支持,通过颜色矩阵(ColorMatrix)和坐标变换矩阵(Matrix)可以完美的做出上面的所说的效果。
颜色矩阵
android中可以通过颜色矩阵(ColorMatrix类)方面的操作颜色,颜色矩阵是一个5x4 的矩阵,如下。
代表的意义如下:
参考:颜色矩阵原理解析
示例:
效果图:
MyImage
public class MyImage extends View {
private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
private Bitmap mBitmap;
private float[] matrixArray = new float[20];
public MyImage(Context context, AttributeSet attrs) {
super(context, attrs);
mBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.test);
invalidate();
}
public void setValues(float[] a) {
for (int i = 0; i < 20; i++) {
matrixArray = a;
}
}
@Override
protected void onDraw(Canvas canvas) {
Paint paint = mPaint;
paint.setColorFilter(null);
canvas.drawBitmap(mBitmap, 0, 0, paint);
ColorMatrix colorMatrix = new ColorMatrix();
//设置颜色矩阵
colorMatrix.set(matrixArray);
//颜色滤镜,将颜色矩阵应用于图片
paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));
//绘图
canvas.drawBitmap(mBitmap, 0, 0, paint);
Log.i("ColorMatrixActivity", "--------->onDraw");
}
}
ColorMatrixActivity
此处用到了id相似(如:tv0,tv1,tv2…….)的findviewbyid的方法,
参考:Android在循环中调用findViewById();
public class ColorMatrixActivity extends Activity {
private MyImage myImage;
private EditText[] ets = new EditText[20];
private float[] changeColorArray = new float[20];
private float[] matrixArray = {
1, 0, 0, 0, 0,
0, 1, 0, 0, 0,
0, 0, 1, 0, 0,
0, 0, 0, 1, 0
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.color_matrix);
myImage = (MyImage) findViewById(R.id.myImage);
//初始化
myImage.setValues(matrixArray);
myImage.invalidate();
for (int i = 0; i < 20; i++) {
int id = getResources().getIdentifier("indexa" + i, "id", getPackageName());
EditText editText = (EditText) findViewById(id);
ets[i] = editText;
}
//通过修改改变颜色滤镜
findViewById(R.id.set_color).setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View arg0) {
for (int i = 0; i < 20; i++) {
float trim = Float.valueOf(ets[i].getText().toString().trim());
changeColorArray[i] = trim;
}
myImage.setValues(changeColorArray);
myImage.invalidate();
}
});
}
}
布局:
为了让EditText可以输入负数和小数,使用这个属性:android:inputType=”numberSigned|numberDecimal”
<?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:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:orientation="vertical">
<com.android.imooc.MyImage
android:id="@+id/myImage"
android:layout_width="match_parent"
android:layout_height="120dp" />
<!--红色-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="R"
android:textColor="#ff4081"
android:textSize="16sp" />
<EditText
android:id="@+id/indexa0"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_marginLeft="15dp"
android:layout_weight="1"
android:background="@drawable/input"
android:inputType="numberSigned|numberDecimal" />
<EditText
android:id="@+id/indexa1"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_marginLeft="5dp"
android:layout_weight="1"
android:background="@drawable/input"
android:inputType="numberSigned|numberDecimal" />
<EditText
android:id="@+id/indexa2"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_marginLeft="5dp"
android:layout_weight="1"
android:background="@drawable/input"
android:inputType="numberSigned|numberDecimal" />
<EditText
android:id="@+id/indexa3"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_marginLeft="5dp"
android:layout_weight="1"
android:background="@drawable/input"
android:inputType="numberSigned|numberDecimal" />
<EditText
android:id="@+id/indexa4"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_marginLeft="5dp"
android:layout_weight="1"
android:background="@drawable/input"
android:inputType="numberSigned|numberDecimal" />
</LinearLayout>
<!--绿色-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="G"
android:textColor="#ff4081"
android:textSize="16sp" />
<EditText
android:id="@+id/indexa5"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_marginLeft="15dp"
android:layout_weight="1"
android:background="@drawable/input"
android:inputType="numberSigned|numberDecimal" />
<EditText
android:id="@+id/indexa6"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_marginLeft="5dp"
android:layout_weight="1"
android:background="@drawable/input"
android:inputType="numberSigned|numberDecimal" />
<EditText
android:id="@+id/indexa7"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_marginLeft="5dp"
android:layout_weight="1"
android:background="@drawable/input"
android:inputType="numberSigned|numberDecimal" />
<EditText
android:id="@+id/indexa8"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_marginLeft="5dp"
android:layout_weight="1"
android:background="@drawable/input"
android:inputType="numberSigned|numberDecimal" />
<EditText
android:id="@+id/indexa9"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_marginLeft="5dp"
android:layout_weight="1"
android:background="@drawable/input"
android:inputType="numberSigned|numberDecimal" />
</LinearLayout>
<!--蓝色-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="B"
android:textColor="#ff4081"
android:textSize="16sp" />
<EditText
android:id="@+id/indexa10"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_marginLeft="15dp"
android:layout_weight="1"
android:background="@drawable/input"
android:inputType="numberSigned|numberDecimal" />
<EditText
android:id="@+id/indexa11"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_marginLeft="5dp"
android:layout_weight="1"
android:background="@drawable/input"
android:inputType="numberSigned|numberDecimal" />
<EditText
android:id="@+id/indexa12"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_marginLeft="5dp"
android:layout_weight="1"
android:background="@drawable/input"
android:inputType="numberSigned|numberDecimal" />
<EditText
android:id="@+id/indexa13"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_marginLeft="5dp"
android:layout_weight="1"
android:background="@drawable/input"
android:inputType="numberSigned|numberDecimal" />
<EditText
android:id="@+id/indexa14"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_marginLeft="5dp"
android:layout_weight="1"
android:background="@drawable/input"
android:inputType="numberSigned|numberDecimal" />
</LinearLayout>
<!--透明度-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="A"
android:textColor="#ff4081"
android:textSize="16sp" />
<EditText
android:id="@+id/indexa15"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_marginLeft="15dp"
android:layout_weight="1"
android:background="@drawable/input"
android:inputType="numberSigned|numberDecimal" />
<EditText
android:id="@+id/indexa16"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_marginLeft="5dp"
android:layout_weight="1"
android:background="@drawable/input"
android:inputType="numberSigned|numberDecimal" />
<EditText
android:id="@+id/indexa17"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_marginLeft="5dp"
android:layout_weight="1"
android:background="@drawable/input"
android:inputType="numberSigned|numberDecimal" />
<EditText
android:id="@+id/indexa18"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_marginLeft="5dp"
android:layout_weight="1"
android:background="@drawable/input"
android:inputType="numberSigned|numberDecimal" />
<EditText
android:id="@+id/indexa19"
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_marginLeft="5dp"
android:layout_weight="1"
android:background="@drawable/input"
android:inputType="numberSigned|numberDecimal" />
</LinearLayout>
<!--提交-->
<Button
android:id="@+id/set_color"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:text="提交" />
</LinearLayout>
drawable/input:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke
android:width="2dp"
android:color="#0000ff" />
</shape>