Android图片色彩变换实现方法

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

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

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

时间: 2024-10-30 09:52:05

Android图片色彩变换实现方法的相关文章

Android图片色彩变换实现方法_Android

最近在做图片相关的应用,所以就各方积累到一些常用的操作,一般来说会有多种方式来实现这一功能,比如  1.采用色度变换  2.采用ColorMatrix颜色矩阵  3.采用对像素点的直接操作 等等,今天就复习一下第一种方式吧,虽然比较单一,得到的结果类型也比较少.  相比较于常见的图片风格变换,一般我们就是换个色彩度,饱和度,亮度等等,这里也恰恰是这个方式 编码思路:  •抽象出图片操作工具类  •创建一个用于操作的Bitmap对象  •使用画布Canvas,画笔Paint  •调色处理,参数控制

Android 图片添加水印的实现方法

Android 图片添加水印的实现方法 实现效果图: 手机端打水印(文字和图片)使用的是Bitmap.Matrix和Canvas类的一些方法, 可以实现拉伸.旋转.位移等等效果. 原理很简单, 就是在画布Canvas上绘制图形.图片.文字等等, 得到你想要的效果图片. 百度搜索图片打水印有很多结果, 没找到斜着打水印的代码,有很多公司都要求上图的效果, 所以写着玩玩. /* 添加全屏斜着45度的文字 / public static Bitmap drawCenterLable(Context c

Android图片色彩变幻

最近在做图片相关的应用,所以就各方积累到一些常用的操作,一般来说会有多种方式来实现这一功能,比如 采用色度变换 采用ColorMatrix颜色矩阵 采用对像素点的直接操作 等等,今天就复习一下第一种方式吧,虽然比较单一,得到的结果类型也比较少. 相比较于常见的图片风格变换,一般我们就是换个色彩度,饱和度,亮度等等,这里也恰恰是这个方式 编码思路: 抽象出图片操作工具类 创建一个用于操作的Bitmap对象 使用画布Canvas,画笔Paint 调色处理,参数控制 画出Bitmap并返回 被相关方法

Android 图片特效处理的方法实例_Android

1. 图片放缩 复制代码 代码如下: // zoom 放缩  public static Bitmap zoomBitmap(Bitmap bitmap, int w, int h) {      int width = bitmap.getWidth();      int height = bitmap.getHeight();      Matrix matrix = new Matrix();      float scaleWidth = w / (float) width;     

Android 图片特效处理的方法实例

1. 图片放缩 复制代码 代码如下:// zoom 放缩  public static Bitmap zoomBitmap(Bitmap bitmap, int w, int h) {      int width = bitmap.getWidth();      int height = bitmap.getHeight();      Matrix matrix = new Matrix(); float scaleWidth = w / (float) width;      float

Android实现GridView中ImageView动态变换的方法_Android

本文实例讲述了Android实现GridView中ImageView动态变换的方法.分享给大家供大家参考.具体如下: 使用YY影音的时候,发现点击GridView的某一个Item,Item里面的图标会在按下的时候发生变换,变成另外一个图片. 自己写了一个类似的demo,具体步骤如下: 1.创建一个包含Grid的Acitity 2.创建item.xml 里面包含一个imageview和一个textview 3.自定义一个adapter,从baseadapter继承 4.在getView中为每个im

Android实现GridView中ImageView动态变换的方法

本文实例讲述了Android实现GridView中ImageView动态变换的方法.分享给大家供大家参考.具体如下: 使用YY影音的时候,发现点击GridView的某一个Item,Item里面的图标会在按下的时候发生变换,变成另外一个图片. 自己写了一个类似的demo,具体步骤如下: 1.创建一个包含Grid的Acitity 2.创建item.xml 里面包含一个imageview和一个textview 3.自定义一个adapter,从baseadapter继承 4.在getView中为每个im

Android开发之图片旋转功能实现方法【基于Matrix】

本文实例讲述了Android开发之图片旋转功能实现方法.分享给大家供大家参考,具体如下: 在Android中进行图像旋转需要使用Matrix,它包含了一个3*3的矩阵,专门用于进行图像变换匹配.Matrix ,中文里叫矩阵,高等数学里有介绍,在图像处理方面,主要是用于平面的缩放.平移.旋转等操作.Matrix没有机构体,它必须初始化,然后通过reset方法和set方法来实现. 首先介绍一下矩阵运算.加法和减法就不用说了,太简单了,对应位相加就好.图像处理,主要用到的是乘法 .下面是一个乘法的公式

Android加载图片内存溢出问题解决方法

  这篇文章主要介绍了Android加载图片内存溢出问题解决方法,本文讲解使用BitmapFactory.Options解决内存溢出问题,需要的朋友可以参考下 1. 在Android软件开发过程中,图片处理是经常遇到的. 在将图片转换成Bitmap的时候,由于图片的大小不一样,当遇到很大的图片的时候会出现超出内存的问题,为了解决这个问题Android API提供了BitmapFactory.Options这个类. 2. 由于Android对图片使用内存有限制,若是加载几兆的大图片便内存溢出.Bi