zoukankan      html  css  js  c++  java
  • 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)因此,在初始化界面的时候,颜色矩阵的输入界面总是显示不全,换了高版本的成功运行了。开发中要考虑不同的运行环境。

      

      

  • 相关阅读:
    论 mysql 主键
    详解 hibernate 悲观锁 乐观锁 深入分析 代码实例
    Mysql 如何 删除大表
    JSP 不能用 不支持 STRUTS标签 报错 The Struts dispatcher cannot be found.
    struts2 防止重复提交 实例代码
    ECLIPSE MYECLIPSE 在线安装SVN
    powerdesigner中给一主键设为自增型auto_increment
    GDAL计算栅格图像统计值相关说明
    GDAL使用DEM数据计算坡度坡向
    到底什么是I/O Port,什么是Memorymapped I/O
  • 原文地址:https://www.cnblogs.com/wktwj/p/4360974.html
Copyright © 2011-2022 走看看