专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 图形/图像

Android图像处理技术(实现Android中的PS)(2)

发布时间:2011-06-27 19:31:05 文章来源:www.iduyao.cn 采编人员:星星草
Android图像处理技术(实现Android中的PS)(二)

一.对图像的本质性分析

1.1.抛出问题
我们学习用各种工具改变一张图片,如PS,美图秀秀等图像处理工具,但是这些软件是怎样实现对图片的更改呢,换句话说,我们怎样用代码更改一个图片的外观呢,再者,为什么会改变呢。

2.2本质分析

我们生活中所见的RGB电子图片的色彩,其实是由一个二维矩阵控制的。
这里写图片描述
我们可以看到,用一个4*5的矩阵乘以颜色矩阵分量,就可以分别得到对应的R,G,B,A,从而调节图片的色彩。
于是,我们通过更改矩阵的值,就可以更改图片的颜色。(至于通过颜色矩阵来计算RGBA和对图片的颜色进行更改,这写都是大牛们的事情了,我们只负责调用接口就好。)

二. 通过颜色矩阵更改图片的色彩
下面我们通过一个Demo来实现通过颜色矩阵更改图片的色彩;

开篇,先试一下效果:
这里写图片描述

于是我们新建了一个布局:

<?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:orientation="vertical" >
//要更改的图片
    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="2" />
//我们会在代码中向GridLayout中添加20个EditText来得到一个颜色矩阵
    <GridLayout
        android:id="@+id/group"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="3"
        android:columnCount="5"
        android:rowCount="4" >
    </GridLayout>

    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        //点击这个按钮对图像进行变换
        <Button 
        android:id="@+id/change"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Change"
        android:onClick="change"
        android:layout_weight="1"/>
        //点击这个按钮对图片进行重置,恢复初始状态。
         <Button 
        android:id="@+id/reset"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Reset"
        android:onClick="reset"
        android:layout_weight="1"/>
    </LinearLayout>
</LinearLayout>

然后就是我们的Activity中的代码了。

public class ColorMatrix extends Activity {
    //待改变的ImageView
    private ImageView mImageView;
    //创建矩阵
    private GridLayout mGridLayout;
    //更改后的图片是个bitmap对象
    private Bitmap mBitmap;
    //矩阵的每个EditText的大小
    private int mEtWidth,mExHeight;
    //装填这20个EditText
    private EditText [] mExs=new EditText[20];
    //颜色矩阵的值,放在一个一维数组中
    private float[] mColorMatrix=new float[20];
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.colormatrix);
        //从资源中加载一个图片
        mBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.photo);
        //你懂的
        mImageView=(ImageView) findViewById(R.id.imageView);
        mGridLayout=(GridLayout) findViewById(R.id.group);
        mImageView.setImageBitmap(mBitmap);
        //绘制完成后执行run()方法的内容
        mGridLayout.post(new Runnable() {

            @Override
            public void run() {
                mEtWidth=mGridLayout.getWidth()/5;
                mExHeight=mGridLayout.getHeight()/4;
                addEx();
                initMatrix();
            }
        });
    }
    //change按钮的响应方法
    public void change(View view){
        getImageMatrix();
        setImageMatrix();
    }
    //reset按钮的响应方法
    public void reset(View view){
        initMatrix();
        getImageMatrix();
        setImageMatrix();
    }
    //得到图片的色彩矩阵
    private void getImageMatrix(){
        for (int i = 0; i < 20; i++) {
            mColorMatrix[i]=Float.valueOf(mExs[i].getText().toString());
        }
    }
    //设置图片的颜色矩阵
    private void setImageMatrix(){
        Bitmap bitmap=Bitmap.createBitmap(mBitmap.getWidth(), mBitmap.getHeight(), Config.ARGB_8888);
        Canvas canvas=new Canvas(bitmap);
        android.graphics.ColorMatrix matrix=new android.graphics.ColorMatrix();
        matrix.set(mColorMatrix);
        Paint paint=new Paint();
        paint.setColorFilter(new ColorMatrixColorFilter(matrix));
        canvas.drawBitmap(mBitmap, 0, 0,paint);
        mImageView.setImageBitmap(bitmap);
    }
    //向GridLayout中添加EditText
    private void addEx(){
        for (int i = 0; i < 20; i++) {
            EditText editText=new EditText(ColorMatrix.this);
            mExs[i]=editText;
            mGridLayout.addView(editText,mEtWidth,mExHeight);
        }
    }
    //你懂的。。。
    private void initMatrix(){
        for (int i = 0; i < 20; i++) {
            if (i%6==0) {
                mExs[i].setText(String.valueOf(1));
            }else {
                mExs[i].setText(String.valueOf(0));
            }
        }
    }
}

注释很清楚,不说其他的了。

最后,Demo地址 :http://download.csdn.net/detail/nsgsbs/8532461

友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: