您的位置:首页 > 大数据 > 人工智能

Paint之setColorFilter(一)

2017-11-10 15:27 253 查看

矩阵乘法:





简介

在编程中有时候需要对图片做特殊的处理,比如将图片做出黑白的,或者老照片的效果,有时候还要对图片进行变换,以拉伸,扭曲等等。

这些效果在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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: