Android Picture颜色校正。如何在Android中更改单个图像的亮度,饱和度等?

android android-layout android-imageview android-image android-graphics

1539 观看

1回复

9 作者的声誉

我正在开发一个应用程序,用户可以在其中更改图像亮度,对比度,饱和度等。我可以使用下面的代码单独完成所有这些操作。

 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。然后,我应该像初次那样获得原始图像。

但是现在,图像颜色不会在反转其值时反转。请帮忙。提前感谢。

作者: Abhishek 的来源 发布者: 2017 年 9 月 15 日

回应 1


0

9471 作者的声誉

这是由于最大和最小亮度(以及饱和度和其他参数)值而发生的。例如,如果当前亮度为200,ins增加100,则亮度值为255(而不是300),因为255为最大值。如果当前亮度(现在为255)降低了100,它将变为255-100 = 155,并且不等于初始值(200)。为了避免这种情况,你应该存储初始位图并没有改变,但改变ColorMatrixColorFilter通过postConcat()并应用彩色滤光片初始位每一次,但不能修改的位图。

因此,您应该为其创建全局值ColorMatrix并在changeBrightness()adjustSaturation()方法中对其进行更改,然后始终将其应用于初始位图。

作者: Andrii Omelchenko 发布者: 2017 年 9 月 15 日
32x32