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

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

2015-03-23 21:01 113 查看
声明:本系列博客系笔记类,观看慕课网的视频教程后写下的笔记,感谢这位前辈的分享:http://blog.csdn.net/eclipsexys

1. 图像分析之RGBA模型

R: Red G : Green B: Blue A : Alpha

色调/色相:物体传递的颜色

饱和度:颜色的饱和程度

亮度/明度:颜色的明暗程度

1.如何在程序中设置RGB:

//      设置色相
ColorMatrix matrix=new ColorMatrix();
matrix.setRotate(0, 30);  //0 代表 R
matrix.setRotate(1, 30);  //1 代表 G
matrix.setRotate(2, 30);  //2 代表 B
//      设置饱和度
matrix.setSaturation(30);
//      设置亮度
matrix.setScale(30, 30, 30, 30);


2.利用上面的知识自助制作一个PS小工具。

先上效果图:



下面我们来看看代码:

首先在MainActivity中定义一个点击时间,跳转到我们的第二个界面,第一个界面很简单,不说了,直接讲重点。

首先贴一下布局代码

<?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:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:orientation="vertical" >

<ImageView
android:id="@+id/imageView"
android:layout_width="200dp"
android:layout_height="200dp"
android:src="@drawable/photo"/>
<SeekBar
android:id="@+id/hueSeekBar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<SeekBar
android:id="@+id/saturationSeekBar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<SeekBar
android:id="@+id/lumSeekBar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
</LinearLayout>


很简单,一个ImageView,三个SeekBar,分别控制图像的色相,饱和度,亮度。

然后我们来看Activity中的代码:

public class PrimarilyActivity extends Activity implements OnSeekBarChangeListener{

private ImageView imageView;
private SeekBar hueSeekBar,saturationSeekBar,lumSeekBar;
private static int MAX_VALUE=255;
private static int MID_VALUE=127;
private float mHue,msaturation,mlum;
private Bitmap bitmap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.primarily);
bitmap=BitmapFactory.decodeResource (getResources(), R.drawable.photo);
imageView=(ImageView) findViewById(R.id.imageView);
imageView.setImageBitmap(bitmap);
hueSeekBar=(SeekBar) findViewById(R.id.hueSeekBar);
saturationSeekBar=(SeekBar) findViewById(R.id.saturationSeekBar);
lumSeekBar=(SeekBar) findViewById(R.id.lumSeekBar);
hueSeekBar.setOnSeekBarChangeListener(this);
saturationSeekBar.setOnSeekBarChangeListener(this);
lumSeekBar.setOnSeekBarChangeListener(this);
hueSeekBar.setMax(MAX_VALUE);
saturationSeekBar.setMax(MAX_VALUE);
lumSeekBar.setMax(MAX_VALUE);
hueSeekBar.setProgress(MID_VALUE);
saturationSeekBar.setProgress(MID_VALUE);
lumSeekBar.setProgress(MID_VALUE);
}

@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
switch (seekBar.getId()) {
case R.id.hueSeekBar:
//转化公式,看不懂先这样记着
mHue=(progress-MID_VALUE)*1.0F/MID_VALUE*180;
break;

case R.id.saturationSeekBar:
//转化公式,看不懂先这样记着
msaturation=progress*1.0F/MID_VALUE;
break;
case R.id.lumSeekBar:
//转化公式,看不懂先这样记着
mlum=progress*1.0F/MID_VALUE;
break;
}
imageView.setImageBitmap(ImageHelper.handleImage(bitmap, mHue, msaturation, mlum));
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {

}
}


也很简单,上面一大堆变量声明和监听器绑定,只有一句话需要说一下,imageView.setImageBitmap(ImageHelper.handleImage(bitmap, mHue, msaturation, mlum));,这里是我们自己定义的一个工具类。它可以改变图片的RGBA,从而实现PS的效果。下面贴一下代码。

public class ImageHelper {

public static Bitmap handleImage(Bitmap bm,float hue,float saturation,float lum){
//确定图片的大小和格式。
Bitmap bmp=Bitmap.createBitmap(bm.getWidth(),bm.getHeight(),Bitmap.Config.ARGB_8888);
//      新建画布
Canvas canvas=new Canvas(bmp);
//      新建画笔
Paint paint=new Paint(Paint.ANTI_ALIAS_FLAG);
//      设置色相
ColorMatrix hueMatrix=new ColorMatrix();
hueMatrix.setRotate(0, hue);
hueMatrix.setRotate(1, hue);
hueMatrix.setRotate(2, hue);
//      设置饱和度
ColorMatrix saturationMatrix=new ColorMatrix();
saturationMatrix.setSaturation(saturation);
//      设置亮度
ColorMatrix lumMatrix=new ColorMatrix();
lumMatrix.setScale(lum, lum, lum, 1);
//      将三种效果进行融合
ColorMatrix imageMatrix=new ColorMatrix();
imageMatrix.postConcat(hueMatrix);
imageMatrix.postConcat(saturationMatrix);
imageMatrix.postConcat(lumMatrix);
//               绘制图片
paint.setColorFilter(new ColorMatrixColorFilter(imageMatrix));
canvas.drawBitmap(bm, 0,0, paint);
//将更改后的图片进行返回。
return bmp;
}
}


主要代码都贴出来了,也有了比较详细的注释。想必大家也可以轻松实现这个PS功能了吧。

最后:Demo地址:http://download.csdn.net/detail/nsgsbs/8526515
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: