您的位置:首页 > 移动开发 > Android开发

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

2015-03-23 22:09 465 查看
一.对图像的本质性分析

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: