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



声明:本系列博客系笔记类,观看慕课网的视频教程后写下的笔记,感谢这位前辈的分享: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中定义一个点击时间,跳转到我们的第二个界面,第一个界面很简单,不说了,直接讲重点。
首先贴一下布局代码


<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