Android图片色彩变换实现方法
最近在做图片相关的应用,所以就各方积累到一些常用的操作,一般来说会有多种方式来实现这一功能,比如
1.采用色度变换
2.采用ColorMatrix颜色矩阵
3.采用对像素点的直接操作
等等,今天就复习一下第一种方式吧,虽然比较单一,得到的结果类型也比较少。
相比较于常见的图片风格变换,一般我们就是换个色彩度,饱和度,亮度等等,这里也恰恰是这个方式
编码思路:
•抽象出图片操作工具类
•创建一个用于操作的Bitmap对象
•使用画布Canvas,画笔Paint
•调色处理,参数控制
•画出Bitmap并返回
•被相关方法调用,得到结果
下面直接上代码吧
首先是布局
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context=".MainActivity"> <ImageView android:id="@+id/imageview" android:layout_width="match_parent" android:layout_height="320dp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:text="色度" android:textSize="18dp" android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <SeekBar android:id="@+id/hueBar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="5" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:text="饱和度" android:textSize="18dp" android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <SeekBar android:id="@+id/saturationBar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="5" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:text="亮度" android:textSize="18dp" android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <SeekBar android:id="@+id/lumBar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="5" /> </LinearLayout> </LinearLayout>
接下来是工具操作类的相关方法
publicstaticBitmaphandleImageLikePS(Bitmapbp,floathue,floatsaturation,floatlum){ Bitmapbitmap=Bitmap.createBitmap(bp.getWidth(),bp.getHeight(),Bitmap.Config.ARGB_8888); Canvascanvas=newCanvas(bitmap); Paintpaint=newPaint(Paint.ANTI_ALIAS_FLAG); ColorMatrixhueMatrix=newColorMatrix(); hueMatrix.setRotate(0,hue); hueMatrix.setRotate(1,hue); hueMatrix.setRotate(2,hue); ColorMatrixsaturationMatrix=newColorMatrix(); saturationMatrix.setSaturation(saturation); ColorMatrixlumMatrix=newColorMatrix(); lumMatrix.setScale(lum,lum,lum,1); ColorMatriximageMatrix=newColorMatrix(); imageMatrix.postConcat(hueMatrix); imageMatrix.postConcat(saturationMatrix); imageMatrix.postConcat(lumMatrix); paint.setColorFilter(newColorMatrixColorFilter(imageMatrix)); canvas.drawBitmap(bp,0,0,paint);//此处如果换成bitmap就会仅仅调用一次,图像将不能被编辑 returnbitmap; }
然后是使用类
packagecom.example.colormatrixdemo; importandroid.app.Activity; importandroid.graphics.Bitmap; importandroid.graphics.BitmapFactory; importandroid.os.Bundle; importandroid.widget.ImageView; importandroid.widget.SeekBar; publicclassMainActivityextendsActivityimplementsSeekBar.OnSeekBarChangeListener{ privateBitmapbitmap; privateImageViewimageview; privateSeekBarhueBar,saturationBar,lumBar; privatefloatmHue,mSaturation,mLum; privatestaticintMAXVALUE=255,MIDVALUE=127; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.masuo); imageview=(ImageView)findViewById(R.id.imageview); hueBar=(SeekBar)findViewById(R.id.hueBar); saturationBar=(SeekBar)findViewById(R.id.saturationBar); lumBar=(SeekBar)findViewById(R.id.lumBar); hueBar.setOnSeekBarChangeListener(this); saturationBar.setOnSeekBarChangeListener(this); lumBar.setOnSeekBarChangeListener(this); hueBar.setMax(MAXVALUE); hueBar.setProgress(MIDVALUE); saturationBar.setMax(MAXVALUE); saturationBar.setProgress(MIDVALUE); lumBar.setMax(MAXVALUE); lumBar.setProgress(MIDVALUE); imageview.setImageBitmap(bitmap); } @Override publicvoidonProgressChanged(SeekBarseekbar,intprogress,booleanarg2){ switch(seekbar.getId()){ caseR.id.hueBar: mHue=(progress-MIDVALUE)*1.0F/MIDVALUE*180; break; caseR.id.saturationBar: mSaturation=progress*1.0F/MIDVALUE; break; caseR.id.lumBar: mLum=progress*1.0F/MIDVALUE; break; } imageview.setImageBitmap(ImageTools.handleImageLikePS(bitmap,mHue,mSaturation,mLum)); } @Override publicvoidonStartTrackingTouch(SeekBararg0){ //TODOAuto-generatedmethodstub } @Override publicvoidonStopTrackingTouch(SeekBararg0){ //TODOAuto-generatedmethodstub } }
然后运行程序,你就可以通过对滑动条的调节来对图像做相关的处理变换了。
注意:
在工具类的方法中最后要对传进去的参数做处理,而不是我们自己声明的bitmap,否则我们将得不到我们实时的图片效果。因为我们的bitmap仅仅是作为一个操作的对象模型,真正需要操作的是我们的bp参数。
总结:在处理图像有许多的方法,尤其是对图像用像素点的方式效果最多,可以呈现多种多样的效果。如老照片,浮雕,底片等等;而采用颜色矩阵也是一种好经典的操作方法。这些很值得我们学习,这样我们就可以是的我们的应用呈现出更加绚丽的色彩及效果咯!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。