欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android图片色彩变换实现方法

程序员文章站 2024-03-06 15:13:14
最近在做图片相关的应用,所以就各方积累到一些常用的操作,一般来说会有多种方式来实现这一功能,比如  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参数。

总结:在处理图像有许多的方法,尤其是对图像用像素点的方式效果最多,可以呈现多种多样的效果。如老照片,浮雕,底片等等;而采用颜色矩阵也是一种好经典的操作方法。这些很值得我们学习,这样我们就可以是的我们的应用呈现出更加绚丽的色彩及效果咯!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。