团队博客

滤镜

 private ImageView image_view;

    private SeekBar sb_alpha;
    private SeekBar sb_rad;
    private SeekBar sb_green;
    private SeekBar sb_blue;

    // 原图
    private Bitmap bitmap;

    private Canvas canvas;
    private Bitmap newBitmap; // 空白的新图
    private Paint paint;
setContentView(R.layout.activity_meitu);

        image_view = findViewById(R.id.image_view);

        sb_alpha = findViewById(R.id.sb_alpha);
        sb_rad = findViewById(R.id.sb_rad);
        sb_green = findViewById(R.id.sb_green);
        sb_blue = findViewById(R.id.sb_blue);

        /**
         * 设置拖动条最大值
         */
        sb_alpha.setMax(SB_MAX);
        sb_rad.setMax(SB_MAX);
        sb_green.setMax(SB_MAX);
        sb_blue.setMax(SB_MAX);

        sb_alpha.setOnSeekBarChangeListener(seekBarChangeListener);
        sb_rad.setOnSeekBarChangeListener(seekBarChangeListener);
        sb_green.setOnSeekBarChangeListener(seekBarChangeListener);
        sb_blue.setOnSeekBarChangeListener(seekBarChangeListener);
 File file = new File(Environment.getExternalStorageDirectory(), "mm.jpg");
        if (!file.exists()) {
            Toast.makeText(this, file.getName() + "不存在", Toast.LENGTH_SHORT).show();
            return;
        }
// 拿一块新的画布,把空白图片和画布关联
        canvas = new Canvas(newBitmap);
        // 设置画布的背景
        canvas.drawColor(Color.WHITE);
        // 拿一只新的画笔
        paint = new Paint();
 private final SeekBar.OnSeekBarChangeListener seekBarChangeListener = new SeekBar.OnSeekBarChangeListener() {

        float alpha = 1; // (0 ~ 1 就是变化的过程) 0就是透明  0.5就是半透明  1就是完全显示
        float rad = 1;
        float green = 1;
        float blue = 1;

        /**
         * 拖动条 拖动过程中,拖动的改变
         * @param seekBar
         * @param progress
         * @param fromUser
         */
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            switch (seekBar.getId()) {
                case R.id.sb_alpha:
                    alpha = (float) (SB_MAX - progress) / SB_MAX;
                    Log.d(TAG, "progress:" + progress + " alpha:" + alpha);
                    break;
                case R.id.sb_rad:
                    rad = (float) (SB_MAX - progress) / SB_MAX;
                    break;
                case R.id.sb_green:
                    green = (float) (SB_MAX - progress) / SB_MAX;
                    break;
                case R.id.sb_blue:
                    blue = (float) (SB_MAX - progress) / SB_MAX;
                    break;
                default:
                    break;

            }

            /**
             * ColorMatrix 做了一系列复杂的颜色值ragb运算
             * 颜色值ragb运算,颜色矩阵是 5*4 的float数组
             */
            ColorMatrix colorMatrix = new ColorMatrix();

            /**
             * 以下这些值,是颜色矩阵的内部运算是需要这样的值,是这样排列的
             * 0, 0, 0, 0, 0,  // 红色
             * 0, 0, 0, 0, 0,  // 绿色
             * 0, 0, 0, 0, 0,  // 蓝色
             * 0, 0, 0, 0, 0,  // 透明的
             *
             * 以下这些值是让图片正常显示,是原图的效果 (0 ~ 1 就是变化的过程)
             * 1, 0, 0, 0, 0,  // 红色
             * 0, 1, 0, 0, 0,  // 绿色
             * 0, 0, 1, 0, 0,  // 蓝色
             * 0, 0, 0, 1, 0,  // 透明的
             */
            colorMatrix.set(new float[]{
                    rad, 0, 0, 0, 0,  // 红色
                    0, green, 0, 0, 0,  // 绿色
                    0, 0, blue, 0, 0,  // 蓝色
                    0, 0, 0, alpha, 0,  // 透明的
            });

            /**
             * 颜色矩阵-颜色过滤器,需要ColorMatrix
             */
            ColorFilter colorFilter = new ColorMatrixColorFilter(colorMatrix);

            paint.setColorFilter(colorFilter);

            canvas.drawBitmap(bitmap, new Matrix(), paint);

         
            image_view.setImageBitmap(newBitmap);
        }

权限

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
posted @ 2021-05-19 20:13  谦寻  阅读(26)  评论(0编辑  收藏  举报