使用ColorMatrix函数处理图片

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

前言

Matrix函数,顾名思义是利用矩阵,利用矩阵对图片的色彩进行处理。

setSaturation()函数——设置饱和度

  1. 如图一所示; 布局为 ImageView 和 SeekBar;方法如下:

    //同时增强 R G B 的色彩饱和度
    public void setSaturation(float sat);
    

    参数 sat 表示当前色彩饱和度放大的倍数;

    1. 取值为 0 表示灰度图像,黑白色;
    2. 取值为1 即为原图;
    3. 取值越大,色彩饱和度越高;
  2. 核心代码如下:

    public class ColorMatrixActivity extends AppCompatActivity {
    	private Bitmap originBitmap, tempBitmap;
    	private ImageView iv_color_saturation;
    	private TextView tv_saturation;
    	private SeekBar sb_color_matrix;
    	
    	private void initView() {
    	    //初始化控件,切记一定要初始化 imageView!一定要初始化 imageView!一定要初始化 imageView!
    	    ……
    	    //调用函数 改变色彩饱和度;0 - 黑白;1 - 原图;max - 色彩鲜明;
    	    originBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.advance_forest);
    	    tempBitmap = Bitmap.createBitmap(originBitmap.getWidth(), originBitmap.getHeight(), Bitmap.Config.ARGB_8888);
    	    sb_color_matrix.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    	        @Override
    	        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    	            saturation = progress;
    	            //不能直接设置 progress,要转换成 String
    	            tv_saturation.setText(String.valueOf(progress));
    	            Bitmap bitmap = handleColorMatrixBmp(progress, redScale, greenScale, blueScale, rotateAxis, 1);
    	            iv_color_saturation.setImageBitmap(bitmap);
    	        }
    	        ……
    	    });
    	}
    	/**
    	 * 设置饱和度 & 处理图片 色彩等信息;二选一,
    	 *
    	 * @param saturation 饱和度
    	 * @param red        红色 缩放
    	 * @param green      红色 缩放
    	 * @param blue       红色 缩放
    	 * @param rotateAxis 绕哪个轴旋转          0 - Red;1 - Green;2 - Blue
    	 * @param i          0 - 改变图片饱和度;1 - 进行色彩缩放;2 - 色彩旋转
    	 * @return
    	 */
    	private Bitmap handleColorMatrixBmp(int saturation, float red, float green, float blue, int rotateAxis, int i) {
    	    // 创建一个相同尺寸的可变的位图区,用于绘制调色后的图片 - 饱和度
    	    Canvas canvas = new Canvas(tempBitmap);
    	    Paint paint = new Paint();
    	    ColorMatrix mColorMatrix = new ColorMatrix();
    	    if (i == 1) {
    	        //设置饱和度
    	        mColorMatrix.setSaturation(saturation);
    	    } 
    	    paint.setColorFilter(new ColorMatrixColorFilter(mColorMatrix));
    	    //将色彩变换后的图片输出到新创建的位图区
    	    canvas.drawBitmap(originBitmap, 0, 0, paint);
    	    return tempBitmap;
    	}
    }
    

setScale()函数——实现色彩缩放

  1. 如图二所示,实现 R G B 三色的色彩缩放,方法如下:

    public void setScale(float rScale, float gScale, float bScale,float aScale);
    

    参数:分别对应R、G、B、A 颜色值的缩放倍数。

  2. 核心代码如下:

    private void initView() {
    	……
    	sb_red_matrix.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    	    @Override
    	    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    	        //不能直接设置 progress,要转换成 String
    	        redScale = progress / 10f;
    	        tv_red.setText(String.valueOf(redScale));
    	        Bitmap bitmap = handleColorMatrixBmp(saturation, redScale, greenScale, blueScale, rotateAxis, 2);
    	        iv_color_saturation.setImageBitmap(bitmap);
    	    }
    	    ……
    	}
    	mColorMatrix.setScale(red, green, blue, 1);
    }
    
    private Bitmap handleColorMatrixBmp(int saturation, float red, float green, float blue, int rotateAxis, int i) {
        // 创建一个相同尺寸的可变的位图区,用于绘制调色后的图片 - 饱和度
        Canvas canvas = new Canvas(tempBitmap);
        Paint paint = new Paint();
        ColorMatrix mColorMatrix = new ColorMatrix();
        if (i == 2) {
    		//生成色彩变化矩阵,
    		mColorMatrix.setScale(red, green, blue, 1);
    	}
    	paint.setColorFilter(new ColorMatrixColorFilter(mColorMatrix));
    	//将色彩变换后的图片输出到新创建的位图区
    	canvas.drawBitmap(originBitmap, 0, 0, paint);
    	return tempBitmap;
    }
    

setRotate()函数——实现色彩旋转

  1. 如图三所示;方法如下:

    public void setRotate(int axis, float degrees);
    

    参数:将旋转围绕某一个颜色轴进行;

    1. axis=0 围绕红色轴旋转;
    2. axis=1 围绕绿色轴旋转;
    3. axis=2 围绕蓝色轴旋转;
    4. degrees 即旋转角度,0 - 360 ;
  2. 核心代码如下:

private void initView() {
	……
	sb_red_rot.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
	    @Override
	    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
	        rotate = progress;
	        //不能直接设置 progress,要转换成 String
	        tv_red_rot.setText(String.valueOf(rotate));
	        rotateAxis = 0;
	        Bitmap bitmap = handleColorMatrixBmp(saturation, redScale, greenScale, blueScale, rotateAxis, 3);
	        iv_color_saturation.setImageBitmap(bitmap);
	    }
   		……
	}
}
private Bitmap handleColorMatrixBmp(int saturation, float red, float green, float blue, int rotateAxis, int i) {
    // 创建一个相同尺寸的可变的位图区,用于绘制调色后的图片 - 饱和度
    Canvas canvas = new Canvas(tempBitmap);
    Paint paint = new Paint();
    ColorMatrix mColorMatrix = new ColorMatrix();
	if (i == 3) {
	    /**
	     * 如果 依次 设置setRotate 那就会使前面的失效,只有最后一个有效;待办事项:能叠加吗?
	     */
	    mColorMatrix.setRotate(rotateAxis, rotate - 180);
	}
	paint.setColorFilter(new ColorMatrixColorFilter(mColorMatrix));
	//将色彩变换后的图片输出到新创建的位图区
	canvas.drawBitmap(originBitmap, 0, 0, paint);
	return tempBitmap;
}


声明:本文整理自《启舰_自定义控件》如有侵权请联系我。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liusaisaiV1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值