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