首页 > 系统 > Android > 正文

Android图片色彩变换实现方法

2019-12-12 05:37:55
字体:
来源:转载
供稿:网友

最近在做图片相关的应用,所以就各方积累到一些常用的操作,一般来说会有多种方式来实现这一功能,比如
 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参数。

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

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表