此次实验主要通过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. 小白日记43:kali渗透测试之Web渗透-SqlMap自动注入(一)-sqlmap参数详解TARGET

    SqlMap自动注入(一) sqlmap是一款非常强大的开源sql自动化注入工具,可以用来检测和利用sql注入漏洞[动态页面中get/post参数.cookie.HTTP头].它由Python语言开发 ...

  2. 用VB操作Excel的方法

    VB是常用的应用软件开发工具之一,由于VB的报表功能有限,而且一但报表格式发生变化,就得相应修改程序,给应用软件的维护工作带来极大的不便.因此有很多程序员现在已经充分利用EXECL的强大报表功来实现报 ...

  3. 3905 - Meteor

    The famous Korean internet company nhn has provided an internet-based photo service which allows The ...

  4. struts2.1笔记03:AOP编程和拦截器概念的简介

    1.AOP编程 AOP编程,也叫面向切面编程(也叫面向方面):Aspect Oriented Programming(AOP),是目前软件开发中的一个热点,也是Spring框架中的一个重要内容.利用A ...

  5. Android入门:一、Android Studio 2.1安装及初始化配置

    以前研究过eclipse +ADT开发android app,没深入再加上工作也用不上就扔在那,现在需要做APP开发,发现eclipse +ADT也不再更新了,google推出了功能强大的Androi ...

  6. [Java]java反射随笔

    类是面向对象的灵魂,一切事物都可以以类来抽象. 在java使用过程中,我们可能会经常用到一个反射的知识,只是别人都封装好的,如jdbc的加载驱动类有一句Class.for(“…jdbc…”).newI ...

  7. warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失

    bug来源: 一直在看sift然后就手贱的给 opencv源码做注释,如果在vs里面打开会一直相安无事,但是问题出在我用了notepad++. 这样就报了标题的错误. 因为notepad++会以uni ...

  8. 【STL】全排列生成算法:next_permutation

    C++/STL中定义的next_permutation和prev_permutation函数是非常灵活且高效的一种方法,它被广泛的应用于为指定序列生成不同的排列. next_permutation函数 ...

  9. 在windows2003系统上安装两个版本的oracle

    想试试oracle11g都有什么变化,于是在机器上又安装了oracle11.1.7版本的.安装很简单,只是安装后如何让两个数据库同时跑起来,需要稍微设置下.1.将11goracle的监听换一个端口,比 ...

  10. Web Service 一些对外公开的网络服务接口

    商业和贸易: 1.股票行情数据 WEB 服务(支持香港.深圳.上海基金.债券和股票:支持多股票同时查询) Endpoint: http://webservice.webxml.com.cn/WebSe ...