Android图片色彩变换实现方法
程序员文章站
2024-03-07 17:46:57
最近在做图片相关的应用,所以就各方积累到一些常用的操作,一般来说会有多种方式来实现这一功能,比如
1.采用色度变换
2.采用colormatri...
最近在做图片相关的应用,所以就各方积累到一些常用的操作,一般来说会有多种方式来实现这一功能,比如
1.采用色度变换
2.采用colormatrix颜色矩阵
3.采用对像素点的直接操作
等等,今天就复习一下第一种方式吧,虽然比较单一,得到的结果类型也比较少。
相比较于常见的图片风格变换,一般我们就是换个色彩度,饱和度,亮度等等,这里也恰恰是这个方式
编码思路:
•抽象出图片操作工具类
•创建一个用于操作的bitmap对象
•使用画布canvas,画笔paint
•调色处理,参数控制
•画出bitmap并返回
•被相关方法调用,得到结果
下面直接上代码吧
首先是布局
<linearlayout xmlns: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>
接下来是工具操作类的相关方法
public static bitmap handleimagelikeps(bitmap bp,float hue,float saturation,float lum){ bitmap bitmap=bitmap.createbitmap(bp.getwidth(), bp.getheight(),bitmap.config.argb_8888); canvas canvas=new canvas(bitmap); 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(bp, 0, 0, paint);//此处如果换成bitmap就会仅仅调用一次,图像将不能被编辑 return bitmap; }
然后是使用类
package com.example.colormatrixdemo; import android.app.activity; import android.graphics.bitmap; import android.graphics.bitmapfactory; import android.os.bundle; import android.widget.imageview; import android.widget.seekbar; public class mainactivity extends activity implements seekbar.onseekbarchangelistener{ private bitmap bitmap; private imageview imageview; private seekbar huebar,saturationbar,lumbar; private float mhue,msaturation ,mlum; private static int maxvalue=255,midvalue=127; @override protected void oncreate(bundle savedinstancestate) { 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 public void onprogresschanged(seekbar seekbar, int progress, boolean arg2) { switch(seekbar.getid()){ case r.id.huebar: mhue=(progress-midvalue)*1.0f/midvalue*180; break; case r.id.saturationbar: msaturation=progress*1.0f/midvalue; break; case r.id.lumbar: mlum=progress*1.0f/midvalue; break; } imageview.setimagebitmap(imagetools.handleimagelikeps(bitmap, mhue, msaturation, mlum)); } @override public void onstarttrackingtouch(seekbar arg0) { // todo auto-generated method stub } @override public void onstoptrackingtouch(seekbar arg0) { // todo auto-generated method stub } }
然后运行程序,你就可以通过对滑动条的调节来对图像做相关的处理变换了。
注意:
在工具类的方法中最后要对传进去的参数做处理,而不是我们自己声明的bitmap,否则我们将得不到我们实时的图片效果。因为我们的bitmap仅仅是作为一个操作的对象模型,真正需要操作的是我们的bp参数。
总结:在处理图像有许多的方法,尤其是对图像用像素点的方式效果最多,可以呈现多种多样的效果。如老照片,浮雕,底片等等;而采用颜色矩阵也是一种好经典的操作方法。这些很值得我们学习,这样我们就可以是的我们的应用呈现出更加绚丽的色彩及效果咯!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。