Android图像处理2

  此次实验主要通过Android中的方法获取输入的颜色矩阵的值,更改后赋值给图片中的颜色矩阵更改图片效果。具体的布局的方法跟笔记1种差不多,只不过这里要添加一个供用户输入的GridView

1   <GridLayout 
2         android:id="@+id/group"
3         android:layout_width="match_parent"
4         android:layout_height="0dp"
5         android:layout_weight="3"
6         android:rowCount="4"    
7         android:columnCount="5">
8         
9     </GridLayout>

  同时定义两个Button分别实现更改和重置功能,定义ImageView展示图片。

  新建colorMatrix类,实现对颜色矩阵的相关操作。

  首先,在创建方法中显示原图,并对相应的组建进行初始化操作。

1 bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher);
2 mImageView = (ImageView) findViewById(R.id.imageView);
3 mGroup = (GridLayout) findViewById(R.id.group);
4 mImageView.setImageBitmap(bitmap);

  在oncreate方法中不能获得控件的宽和高,所以需要使用post方法

 1 mGroup.post(new Runnable() {
 2 
 3             @Override
 4             public void run() {
 5                 // TODO Auto-generated method stub
 6                 mEtWidth = mGroup.getWidth() / 5;
 7                 mEtHeight = mGroup.getHeight() / 4;
 8                 addEts();
 9                 matrixInit();
10             }
11         });

  这样在控件绘制完毕之后执行Runnable方法获得控件的高和宽。这里由于是颜色矩阵是一个4行5列的矩阵,所以,需要得到每个editText的宽和高,最后使用一个循环进行添加editText操作。

1 private void addEts() {
2         for (int i = 0; i < 20; i++) {
3             EditText editText = new EditText(colorMatrix.this);
4             mEts[i] = editText;
5             mGroup.addView(editText, mEtWidth, mEtHeight);
6         }
7     }

  

1 private void matrixInit() {
2         for (int i = 0; i < 20; i++) {
3             if (i % 6 == 0) {
4                 mEts[i].setText(String.valueOf(1));
5             } else {
6                 mEts[i].setText(String.valueOf(0));
7             }
8         }
9     }

  添加完成后,我们需要对矩阵进行初始化操作,这里就要用到颜色矩阵的相关知识。

  颜色矩阵4行5列,初始状态如图。

  

  从上到下四行分别控制R,G,B,A,第5列可以在原有基础上增减相应的值,类似于前面的方阵是系数矩阵成倍进行调整,后面是一个常数项进行微调。

  添加editText操纵和初始化操作结束之后,我们就得到了初始界面。以上就结束了onCreate方法中的相关创建操作。

  

  下面我们就要实现如何通过editText中的值实现对颜色矩阵的更改进而更改图片。

  

  首先我们要获取输入的editText中的值存入数组中。

    public void getMatrix() {
        for (int i = 0; i < 20; i++) {
            mColorMatrix[i] = Float.valueOf(mEts[i].getText().toString());
        }
    } 

  获得值后,就要更改图片的颜色矩阵,笔记1中已经讲到,我们是不能对传入的bitmap进行直接修改的,需要得到它的一个复制,因此,我们实际上是在画布上画修改后的复制。

  我们通过ColorMatrix的set方法,将数组转化为颜色矩阵,,然后使用画笔将颜色矩阵画入画布即可。

 1 private void setImageMatrix() {
 2         Bitmap bmp = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(),
 3                 Bitmap.Config.ARGB_8888);
 4         android.graphics.ColorMatrix colorMatrix = new android.graphics.ColorMatrix();
 5         colorMatrix.set(mColorMatrix); // 将数组传递进来使其变为颜色矩阵
 6 
 7         Canvas canvas = new Canvas(bmp);
 8         Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); // 抗锯齿
 9 
10         paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));
11         canvas.drawBitmap(bitmap, 0, 0, paint);
12         mImageView.setImageBitmap(bmp);
13     }

  最后实现Button的点击事件,改变图片时,我们需要首先获取颜色矩阵,然后将颜色矩阵作用在图片上输出即可。

  reset时,同样要重置颜色矩阵,作用在图片上,在这里,getMatrix相当于是一个桥梁,将用户界面的输入和程序对图片的处理联系起来。

 1 public void btnChange(View view) {
 2         getMatrix();
 3         setImageMatrix();
 4     }
 5 
 6     public void btnReset(View view) {
 7         matrixInit();
 8         getMatrix();
 9         setImageMatrix();
10     }

  最后不要忘记在main_Activity中启动相关的类,并且在配置文件中对新建的Activity进行登记。

  至此,仿照慕课上的关于颜色矩阵的程序已经完成,思路还算比较清晰,在测试中遇到了一个小问题,测试的手机比较老了(安卓2.3)因此,在初始化界面的时候,颜色矩阵的输入界面总是显示不全,换了高版本的成功运行了。开发中要考虑不同的运行环境。

  

  

原文地址:https://www.cnblogs.com/wktwj/p/4360974.html