Коррекция цвета изображения Android. Как изменить яркость, насыщенность и т. д. одного изображения в Android?

Я разрабатываю приложение, в котором пользователь может изменять яркость, контрастность, насыщенность и т. д. изображения. Я могу сделать все это отдельно, используя приведенный ниже код.

 seekBar_brightness.setMax(512);
        seekBar_brightness.setProgress(255);
        seekBar_brightness.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {


                progress = progress - 255;

                Log.e("ImageColor_bri global", "" + bitmap_global);

                Bitmap new_bm = changeBrightness(bitmap_global, (float) progress);
                Log.e("ImageColor_bri local", "" + new_bm);
                imageView.setImageBitmap(new_bm);
                bitmap_local = new_bm;

               // imageView.getDrawable().setColorFilter(ColorFilterGenerator.adjustBrightness(progress));//foto is my ImageView
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });

        seekbar_saturation.setMax(512);
        seekbar_saturation.setProgress(255);
        //seekbar_saturation.setThumbOffset(255);
        seekbar_saturation.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

                 progress = progress-255;
                // imageView.buildDrawingCache();
                // Bitmap bimap = imageView.getDrawingCache();

                //  imageView.setColorFilter(value);
                Log.e("ImageColor_satu global", "" + bitmap_global);
                Bitmap new_bm = adjustSaturation(bitmap_global, progress);
                Log.e("ImageColor_satu local", "" + new_bm);
                imageView.setImageBitmap(new_bm);
                bitmap_local = new_bm;


               // ColorMatrix matrix = new ColorMatrix();
              //  matrix.setSaturation(progress);
               // ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
               // imageView.getDrawable().setColorFilter(ColorFilterGenerator.adjustSaturation(progress));


            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });

public static Bitmap changeBrightness(Bitmap bmp, float brightness) {
        ColorMatrix cm = new ColorMatrix(new float[]
                {
                        1, 0, 0, 0, brightness,
                        0, 1, 0, 0, brightness,
                        0, 0, 1, 0, brightness,
                        0, 0, 0, 1, 0
                });

        Bitmap ret = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig());

        Canvas canvas = new Canvas(ret);

        Paint paint = new Paint();
        paint.setColorFilter(new ColorMatrixColorFilter(cm));
        canvas.drawBitmap(bmp, 0, 0, paint);

        return ret;
    }

  public static Bitmap adjustSaturation(Bitmap bmp, float value) {
        value = cleanValue(value, 100);
        if (value == 0) {
            return bmp;
        }

        float x = 1 + ((value > 0) ? 3 * value / 100 : value / 100);
        float lumR = 0.3086f;
        float lumG = 0.6094f;
        float lumB = 0.0820f;

        float[] mat = new float[]
                {
                        lumR * (1 - x) + x, lumG * (1 - x), lumB * (1 - x), 0, 0,
                        lumR * (1 - x), lumG * (1 - x) + x, lumB * (1 - x), 0, 0,
                        lumR * (1 - x), lumG * (1 - x), lumB * (1 - x) + x, 0, 0,
                        0, 0, 0, 1, 0,
                        0, 0, 0, 0, 1
                };

        ColorMatrix cm = new ColorMatrix(mat);

        Bitmap ret = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig());

        Canvas canvas = new Canvas(ret);

        Paint paint = new Paint();
        paint.setColorFilter(new ColorMatrixColorFilter(cm));
        canvas.drawBitmap(bmp, 0, 0, paint);

        return ret;
    }

Проблема в том, что после увеличения или уменьшения яркости изображения и увеличения или уменьшения значения насыщенности цвет изображения полностью меняется.

Я должен добиться того, чтобы, если я вернусь к начальным значениям панели поиска яркости и насыщенности, я должен получить фактическое изображение, когда оно было в первый раз.

Например, если увеличить значение яркости с 0 до 100, затем изменить значение насыщенности с 0 до 80. Затем я изменю значение яркости и насыщенности на 0. Тогда я должен получить исходное изображение, как оно было в первый раз.

Но теперь цвет изображения не меняется при изменении его значения. Пожалуйста помоги. Спасибо заранее.


person Abhishek    schedule 15.09.2017    source источник


Ответы (1)


Это происходит из-за максимального и минимального значения яркости (а также насыщенности и других параметров). Например. если текущая яркость равна 200, а ins увеличена на 100, значение яркости становится 255 (а не 300), потому что 255 — максимальное значение. Если текущая яркость (сейчас 255) уменьшилась на 100, то она становится 255 - 100 = 155 и становится не равной исходному значению (200). Чтобы избежать этого, вы должны сохранить исходный битмап и не изменять его, а менять ColorMatrixColorFilter через postConcat() и каждый раз применять цветовой фильтр к исходному битмапу, а не к измененному битмапу.

Таким образом, вы должны создать глобальное значение для ColorMatrix и изменить его в своих методах changeBrightness() и adjustSaturation(), а затем всегда применять его к исходному растровому изображению.

person Andrii Omelchenko    schedule 15.09.2017