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

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

public void onStopTrackingTouch(SeekBar seekBar) {

}

}

运行后,拖动Seekbar,可以发现,我们成功地改变了图片的各项属性


原理分析——矩阵变换

我们之前用到了ColorMatrix类,众所周知,Matrix是矩阵的意思,所以这里实际上我们是通过操作矩阵来处理图像。Android中提供了如图的颜色矩阵,来帮助我们进行图像效果的处理, 图像中的每一个点都是一个矩阵分量,是由R、G、B、A和1组成:

我们用这个颜色矩阵乘上像素点对应的颜色矩阵分量,就能得到一个新的矩阵R1G1B1A1。如图:

这样,我们就把一个像素点通过颜色矩阵变换成了新的像素点(颜色调整后的效果)。

我们把如图的矩阵称为初始化矩阵,因为它乘上原来的像素点后,仍不变。

下面我们看一下这个矩阵࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值