声明:本系列博客系笔记类,观看慕课网的视频教程后写下的笔记,感谢这位前辈的分享: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

更多相关文章

  1. Android(安卓)LCD和键盘 背光亮度数据流分析
  2. 下拉菜单中自动亮度调节&P 上背光调节
  3. Android获取并设置Activity的亮度
  4. Android图像处理(一)色调、饱和度、亮度
  5. Android 实现调整屏幕亮度,以及自动适应
  6. android button light 流程分析(二) — HAL & JNI
  7. 控件:拖动条 --- SeekBar(改变屏幕亮度)
  8. Android 使用颜色矩阵改变图片颜色,透明度,亮度
  9. Android基于Socket无线遥控(1)--Socket基本模型搭建

随机推荐

  1. android tab去掉黑线
  2. Android(安卓)studio使用JNI实例(1)
  3. Android 将系统的back键模拟成为home键的
  4. android程序启动即开启动态权限
  5. 围绕原生与 H5 交互实践聊聊 Android(安
  6. Android系统字体加载流程
  7. Android之模仿微信登陆界面(一)
  8. Android ListView 最后一行分割线不显示
  9. android 使用include 调用内部组件
  10. 2014.01.07 ——— android开发实例之Qui