Android图像处理技术(实现Android中的PS)(一)
16lz
2021-01-24
声明:本系列博客系笔记类,观看慕课网的视频教程后写下的笔记,感谢这位前辈的分享: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
更多相关文章
- Android(安卓)LCD和键盘 背光亮度数据流分析
- 下拉菜单中自动亮度调节&P 上背光调节
- Android获取并设置Activity的亮度
- Android图像处理(一)色调、饱和度、亮度
- Android 实现调整屏幕亮度,以及自动适应
- android button light 流程分析(二) — HAL & JNI
- 控件:拖动条 --- SeekBar(改变屏幕亮度)
- Android 使用颜色矩阵改变图片颜色,透明度,亮度
- Android基于Socket无线遥控(1)--Socket基本模型搭建