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

   <GridLayout
android:id="@+id/group"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="3"
android:rowCount="4"
android:columnCount="5"> </GridLayout>

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

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

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

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

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

 mGroup.post(new Runnable() {

             @Override
public void run() {
// TODO Auto-generated method stub
mEtWidth = mGroup.getWidth() / 5;
mEtHeight = mGroup.getHeight() / 4;
addEts();
matrixInit();
}
});

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

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

  

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

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

  颜色矩阵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方法,将数组转化为颜色矩阵,,然后使用画笔将颜色矩阵画入画布即可。

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

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

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

 public void btnChange(View view) {
getMatrix();
setImageMatrix();
} public void btnReset(View view) {
matrixInit();
getMatrix();
setImageMatrix();
}

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

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

  

  

Android图像处理2的更多相关文章

  1. android 图像处理系列合集

    为了便于大家对滤镜算法的学习,以后发布的图像处理滤镜系列帖子会在这里汇总,本人第一次写合集,写得不好的地方大家请见谅,手头上虽然有一些滤镜的算法,但是大多不是android版的,教程里的代码大多是我借 ...

  2. Android图像处理实例教程

    Android图像处理实例教程 原始出处 http://vaero.blog.51cto.com/4350852/856750

  3. Android图像处理1

    项目开发要用,在慕课中学习了一下关于Android图像处理的相关功能,并进行了整理. 在Android中,我们通过最基本的改变图像的RGBA值,改变图像的颜色与饱和度. Android中有ColorM ...

  4. Android图像处理 - 高斯模糊的原理及实现

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 由 天天P图攻城狮 发布在云+社区 作者简介:damonxia(夏正冬),天天P图Android工程师 前言 高斯模糊是图像处理中几乎每个程序员 ...

  5. android图像处理系列之四-- 给图片添加边框(上)

    图片处理时,有时需要为图片加一些边框,下面介绍一种为图片添加简单边框的方法. 基本思路是:将边框图片裁剪成八张小图片(图片大小最好一致,不然后面处理会很麻烦),分别对应左上角,左边,左下角,下边,右下 ...

  6. android图像处理系列之五-- 给图片添加边框(中)

    前面一篇讲到给图片加边框的方式,只能给图片加一些有规则的边框,如果想加一些比较精美的效果,就有点麻烦了.下面就给出解决这个问题的思路. 思路是:一些比较精美的花边图片我们是很难用代码控制,就目前本人水 ...

  7. android图像处理系列之四--给图片添加边框(上)

    图片处理时,有时需要为图片加一些边框,下面介绍一种为图片添加简单边框的方法. 基本思路是:将边框图片裁剪成八张小图片(图片大小最好一致,不然后面处理会很麻烦),分别对应左上角,左边,左下角,下边,右下 ...

  8. android图像处理系列之五--给图片添加边框(中)

    前面一篇讲到给图片加边框的方式,只能给图片加一些有规则的边框,如果想加一些比较精美的效果,就有点麻烦了.下面就给出解决这个问题的思路. 思路是:一些比较精美的花边图片我们是很难用代码控制,就目前本人水 ...

  9. android图像处理系列之七--图片涂鸦,水印-图片叠加

    图片涂鸦和水印其实是一个功能,实现的方式是一样的,就是一张大图片和一张小点图片叠加即可.前面在android图像处理系列之六--给图片添加边框(下)-图片叠加中也讲到了图片叠加,里面实现的原理是直接操 ...

  10. Android图像处理之Bitmap类

      Bitmap是Android系统中的图像处理的最重要类之一.用它可以获取图像文件信息,进行图像剪切.旋转.缩放等操作,并可以指定格式保存图像文件.本文从应用的角度,着重介绍怎么用Bitmap来实现 ...

随机推荐

  1. 小白日记41:kali渗透测试之Web渗透-SQL手工注入(三)-猜测列名、表名、库名、字段内容,数据库写入

    SQL手工注入 靶机:metasploitable(低)  1.当无权读取infomation_schema库[MySQL最重要的源数据库,必须有root权限]/拒绝union.order by语句 ...

  2. Windows Service 之 安装失败后的删除

    一个windows服务在卸载之后并不会马上从服务列表中消失掉,而是在服务列表中会显示服务被禁用:这样在你需要再次安装同名服务时,就装不了了,会被提示同名的服务已经存在.如果是在本地安装,这种情况很容易 ...

  3. iOS之隐藏状态栏

    iOS7中,不仅应用的风格有一定的变化,状态栏变化比较大,我们可以看到UIViewController的状态栏与导航栏基本是一体的.因此UIVIEWCONTROLLER的hide/show状态的方法也 ...

  4. mongoDB 插入数据 用java实现

    import java.net.UnknownHostException; import com.mongodb.BasicDBObject; import com.mongodb.DB; impor ...

  5. 虚拟机中Ubuntu设置固定IP方法

    --2013年7月29日20:39:16 场景:在搭建hadoop分布式系统的时候,每次重启节点,节点对应的ip发生变化,现在需要将每个节点绑固定的ip --原理: 设置节点用的网卡->绑定ip ...

  6. MSP430常见问题之通信类

    Q1: 430 串口中,有个R/D 控制线,在接收上位机的数据,但本身的数据有无发送完毕不知道啊,什么时候才可置低R/d 位来接收数据啊?好像430 没有发送完中断标志A1:字节主动发送,一般都能发出 ...

  7. hdu 3473 裸的划分树

    思路: 用Sum[dep][i]记录从tree[po].l到i中进入左子树的和. #include<iostream> #include<algorithm> #include ...

  8. poj 2723 2-SAT问题

    思路:二分枚举能开的门的数量,将每次枚举转换成2-SAT问题.这里存在的矛盾是假设有门上a,b两个锁,a锁对应于1号钥匙,而一号钥匙的配对是2号钥匙,b锁对应于3号钥匙,3号的配对是4号钥匙.那么2号 ...

  9. 【转】六年软件测试感悟-从博彦到VMware

    不知不觉已经从事软件测试六年了,2006毕业到进入外包公司外包给微软做软件测试, 到现在加入著名的外企.六年的时间过得真快. 长期的测试工作也让我对软件测试有了比较深入的认识.但是我至今还是一个底层的 ...

  10. ASP.NET中处理异常的几种方式

    1.程序中使用try catch 对于预知会发生异常的代码段使用try catch主动捕获异常,适用于提示给用户或跳转到错误页面,或者通过其它方式处理异常(日志.通知等). int i = 10; i ...