Android图像处理(一)色调、饱和度、亮度

原创 2016年05月31日 20:16:21


色调

ColorMatrix hueMatrix = new ColorMatrix();

hueMatrix.setRotate(0, hue); 0-代表R

hueMatrix.setRotate(1, hue); 1-代表G

hueMatrix.setRotate(2, hue); 2-代表B


饱和度

ColorMatrix saturationMatrix = new ColorMatrix();

saturationMatrix.setSaturation(saturation);


亮度

ColorMatrix lumMatrix = new ColorMatrix();

lumMatrix.setScale(lum, lum, lum, 1);


public class PrimaryColor extends Activity implements SeekBar.OnSeekBarChangeListener {

    private ImageView mImageView;

    private SeekBar mSeekbarhue, mSeekbarSaturation, mSeekbarLum;

    private static int MAX_VALUE = 255;
    private 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.primary_color);
        bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test3);
        mImageView = (ImageView) findViewById(R.id.imageView);
        mSeekbarhue = (SeekBar) findViewById(R.id.seekbarHue);
        mSeekbarSaturation = (SeekBar) findViewById(R.id.seekbarSaturation);
        mSeekbarLum = (SeekBar) findViewById(R.id.seekbarLum);

        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);

        mImageView.setImageBitmap(bitmap);
    }

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        switch (seekBar.getId()) {
            case R.id.seekbarHue:
                //色调
                mHue = (progress - MID_VALUE) * 1.0F / MID_VALUE * 180;
                break;
            case R.id.seekbarSaturation:
                //饱和度
                mSaturation = progress * 1.0F / MID_VALUE;
                break;
            case R.id.seekbarLum:
                //亮度
                mLum = progress * 1.0F / MID_VALUE;
                break;
        }
        mImageView.setImageBitmap(ImageHelper.handleImageEffect(bitmap, mHue, mSaturation, mLum));
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {

    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {

    }
}



实现步骤

1.实现静态方法

2.创建Bitmap对象

3.创建画笔对象

4.调整图像效果

5.返回图像


public class ImageHelper {

    /**
     *
     * @param bm 图像 (不可修改)
     * @param hue 色相
     * @param saturation 饱和度
     * @param lum 亮度
     * @return
     */
    public static Bitmap handleImageEffect(Bitmap bm, float hue, float saturation, floatlum) {

        Bitmap bmp = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), Bitmap.Config.ARGB_8888);

        Canvas canvas = new Canvas(bmp);

        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

        ColorMatrix hueMatrix = new ColorMatrix();
        hueMatrix.setRotate(0, hue); // R
        hueMatrix.setRotate(1, hue); // G
        hueMatrix.setRotate(2, hue); // B

        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(bm, 0, 0, paint);

        return bmp;
    }

}

xml代码中设置控件的监听事件,在Button标签里设置onClick属性调用需要执行的方法,该方法:

访问权限必须是public类型

必须无返回值

方法名要与xml定义方法名相同

参数列表必须是View类型的参数


图像处理,其实就是研究不同的颜色矩阵对图像的处理效果


public class ColorMatrix extends Activity {

    private ImageView mImageView;
    private GridLayout mGroup;
    private Bitmap bitmap;

    private int mEtWidth, mEtHeight;

    private EditText[] mEts = new EditText[20];

    //对应颜色矩阵
    private float[] mColorMatrix = new float[20];

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.color_matrix);
        bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test1);
        mImageView = (ImageView) findViewById(R.id.imageView);
        mGroup = (GridLayout) findViewById(R.id.group);
        mImageView.setImageBitmap(bitmap);

        //为什么我的代码中自动优化成Lambda表达式了??? = =
        mGroup.post(new Runnable() {

            @Override
            public void run() {
                //控件绘制完成后再去获取宽高
                //若直接在onCreate中去获取
                //则会得到两个0
                //绘制后执行
                mEtWidth = mGroup.getWidth() / 5;
                mEtHeight = mGroup.getHeight() / 5;
                addEts();
                initMatrix();//赋值
            }
        });
    }

    private void getMatrix() {
        for (int i = 0; i < 20; i++) {
            mColorMatrix[i] = Float.valueOf(mEts[i].getText().toString());
        }
    }

    private void setImageMatrix() {
        Bitmap bmp = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
        android.graphics.ColorMatrix colorMatrix = new android.graphics.ColorMatrix();
        colorMatrix.set(mColorMatrix);

        Canvas canvas = new Canvas(bmp);
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));
        canvas.drawBitmap(bitmap, 0, 0, paint);
        mImageView.setImageBitmap(bmp);
    }

    public void btnChange(View view) {
        getMatrix();
        setImageMatrix();
    }

    public void btnReset(View view) {
        initMatrix();
        getMatrix();
        setImageMatrix();
    }

    private void addEts() {
        for (int i = 0; i < 20; i++) {
            EditText editText = new EditText(ColorMatrix.this);
            mEts[i] = editText;
            mGroup.addView(editText, mEtWidth, mEtHeight);
        }
    }

    /**
     * 初始矩阵
     * 4行5列
     * 0/6/12/18 为1
     * 其余为0
     */
    private void initMatrix() {
        for (int i = 0; i < 20; i++) {
            if (i % 6 == 0) {
                mEts[i].setText(String.valueOf(1));
            } else {
                mEts[i].setText(String.valueOf(0));
            }
        }
    }

}




怀旧效果

|0.393 0.769 0.189 0 0|

|0.349 0.686 0.168 0 0|

|0.272 0.534 0.131 0 0|

|0         0         0         1 0|


https://github.com/LiuchangDuan/demo


版权声明:转载请注明出处 举报

相关文章推荐

Android学习笔记之图像颜色处理(ColorMatrix)

对图像进行颜色方面的处理,通过使用颜色矩阵(ColorMatrix)来实现。从而可以达到很多特效如黑白老照片、泛黄旧照片等等。 1.颜色矩阵(ColorMatrix) 这里有详细的介绍:http:...

Android改变图像的饱和度、亮度和对比度

转自:http://blog.csdn.net/sxwyf248/article/details/7019731

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

图像处理中色调、亮度、饱和度的定义

在图像处理中,常见的颜色模型包括HSB(色相、饱和度、亮度)、RGB(红色、绿色、蓝色)、CMYK(青色、品红、黄色、黑色)和CIE L*a*b*等,因此,相应的颜色模式也就有RGB、CMYK、Lab...

Android Bitmap颜色、亮度、饱和度等变化

颜色矩阵 ColorMatrix cm = new ColorMatrix(); paint.setColorFilter(new ColorMatrixColorFilter(cm)); 1 ...

android图像处理系列之三--图片色调饱和度、色相、亮度处理

原图: 处理后: 下面贴代码: 一、图片处理层: package com.jacp.tone.view; import java.util.ArrayList; impor...

用简单的驱动,自己写一个连接池

虽然现在用APACHE COMMONS DBCP可以非常方便的建立数据库连接池, 但是像这篇文章把数据库连接池的内部原理写的这么透彻,注视这么完整, 真是非常难得,让开发人员可以更深层次的理解数据...

分享一个好东西(一天精通MongoDB数据库)

https://pan.baidu.com/s/1o7V5e8U 总共几个小时的视频,看来之后醍醐灌顶。分享出来。

关注CSDN程序人生公众号,轻松获得下载积分

关注公众号 在公众号里回复“”秘密“”两个字 返回 http://task.csdn.net/m/task/home?task_id=398 领取奖励 提示:根据公众号里的自动回复,完成...

netstat实现

使用GetTCPTable,SetTCPTable枚举/删除TCP端口连接情况(类似Netstat) 收藏 /* *IP Helper Function中提供了很多功能强大,使用简单的网络函数 ...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)