Android 图像处理入门(上)——图像色彩变换

imageMatrix.postConcat(lumMatrix);

paint.setColorFilter(new ColorMatrixColorFilter(imageMatrix));

canvas.drawBitmap(bitmap,0,0,paint);

return currentBitmap;

}

}

这里,用到了Canvas类,canvas类是一个画布类,后面进行的操作都会在画布上进行,而不是在原图上。建立了三个ColorMatrix,进行了不同方面的操作,并用postConcat方法将这些Matrix进行融合。通过setColorFilter方法来修改paint的相关属性,然后在canvas上将图片绘制出来。最后将修改后的图片返回出来。

回到我们的界面。设计是用三个Seekbar来分别控制色相、饱和度、亮度三个属性。

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android”

android:layout_width=“match_parent”

android:layout_height=“match_parent”

android:orientation=“vertical”>

<ImageView

android:id=“@+id/image_view”

android:layout_width=“300dp”

android:layout_height=“300dp”

android:scaleType=“centerCrop”

android:layout_marginTop=“24dp”

android:layout_marginBottom=“24dp”

android:layout_centerHorizontal=“true”/>

<SeekBar

android:id=“@+id/seekbar_hue”

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:layout_margin=“10dp”

android:layout_below=“@id/image_view”/>

<SeekBar

android:id=“@+id/seekbar_saturation”

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:layout_margin=“10dp”

android:layout_below=“@id/seekbar_hue”/>

<SeekBar

android:id=“@+id/seekbar_lum”

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:layout_margin=“10dp”

android:layout_below=“@id/seekbar_saturation”/>

然后编辑PrimaryColorActivity。这里我们定义了一个最大值及中间值,可以让它从中间值开始变化,然后通过一系列方法来分别获取色相、饱和度、亮度的值。

public class PrimaryColorActivity extends AppCompatActivity implements SeekBar.OnSeekBarChangeListener{

private ImageView mImageView;

private SeekBar mSeekbarHue,mSeekbarSaturation,mSeekbarLum;

private final static int MAX_VALUE = 255; //最大值

private final static int MID_VALUE = 127; //中间值

private float mHue,mSaturation,mLum;

private Bitmap bitmap;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_primary_color);

//获取图片

bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test1);

mImageView = (ImageView)findViewById(R.id.image_view);

mImageView.setImageBitmap(bitmap);

mSeekbarHue = (SeekBar)findViewById(R.id.seekbar_hue);

mSeekbarSaturation = (SeekBar)findViewById(R.id.seekbar_saturation);

mSeekbarLum = (SeekBar)findViewById(R.id.seekbar_lum);

mSeekbarHue.setOnSeekBarChangeListener(this);

mSeekbarSaturation.setOnSeekBarChangeListener(this);

mSeekbarLum.setOnSeekBarChangeListener(this);

mSeekbarHue.setMax(MAX_VALUE);

mSeekbarSaturation.setMax(MAX_VALUE);

mSeekbarLum.setMax(MAX_VALUE);

mSeekbarHue.setProgress(MID_VALUE);

mSeekbarSaturation.setProgress(MID_VALUE);

mSeekbarLum.setProgress(MID_VALUE);

}

@Override

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

switch (seekBar.getId()){

case R.id.seekbar_hue:

//将0-255的值转换为色调值

mHue = (progress - MID_VALUE)1.0F/MID_VALUE180;

break;

case R.id.seekbar_saturation:

//将0-255值转换为饱和度值

mSaturation = progress*1.0F/MID_VALUE;

break;

case R.id.seekbar_lum:

//将0-255的值转换为亮度值

mLum = progress*1.0F/MID_VALUE;

break;

}

mImageView.setImageBitmap(ImageUtils.handleImageEffect(bitmap,

mHue,mSaturation,mLum));

}

@Override

public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override

pu

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值