Android: изменение контрастности и яркости изображения при прокрутке панели поиска

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

Код:

final SeekBar SeekBar_contrast = (SeekBar) dialog_preview.findViewById(R.id.SeekBar_contrast);
        final SeekBar SeekBar_brightness = (SeekBar) dialog_preview.findViewById(R.id.SeekBar_brightness);
        SeekBar_contrast.setMax(10);
        SeekBar_brightness.setMax(510);
        SeekBar_contrast.setProgress((1));
        SeekBar_brightness.setProgress((255));              
        SeekBar_contrast.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener()
        {
             @Override
             public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) 
             {  
                    new_bm = changeBitmapContrastBrightness(bimap, (float)(progress-1),(float)(SeekBar_brightness.getProgress()-255));
                    cropImageView.setImageBitmap(new_bm);
             } 

             @Override
             public void onStartTrackingTouch(SeekBar seekBar) 
             {
             } 

             @Override
             public void onStopTrackingTouch(SeekBar seekBar) 
             {              
             }                  
        });
        SeekBar_brightness.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener()
        {
             @Override
             public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) 
             {  
                    new_bm = changeBitmapContrastBrightness(bimap, (float)(SeekBar_contrast.getProgress()-1), (float)(progress-255));
                    cropImageView.setImageBitmap(new_bm);
             } 

             @Override
             public void onStartTrackingTouch(SeekBar seekBar) 
             {
             } 

             @Override
             public void onStopTrackingTouch(SeekBar seekBar) 
             {

             }                  
        });

Метод:

public static Bitmap changeBitmapContrastBrightness(Bitmap bmp, float contrast, float brightness)
{
    ColorMatrix cm = new ColorMatrix(new float[]
            {
                contrast, 0, 0, 0, brightness,
                0, contrast, 0, 0, brightness,
                0, 0, contrast, 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;
}

Параметры следующие:

 @param bmp input bitmap
 * @param contrast 0..10 1 is default
 * @param brightness -255..255 0 is default
 * @return new bitmap

Вопрос:

Хотя значение яркости по умолчанию равно 0, что является серединой диапазона, и, следовательно, прокрутка панели поиска яркости работает отлично, я хотел бы спросить, как установить максимальное значение панели поиска и прогресс изменений для контрастности, как значение по умолчанию равно 1, что не является серединой диапазона.

При прокрутке seekbar_contrast приведенный выше код создаст изображение, показывающее «негативный цвет» при прогрессе = 0, а прокрутка вправо (большее значение панели поиска) создаст белое изображение.


person pearmak    schedule 28.12.2014    source источник


Ответы (1)


Прежде всего, в onProgressChanged слушателе контрастной панели поиска вы должны сделать -255 для значения яркости панели поиска.

Чтобы поместить значение контраста по умолчанию в середину, выполните следующий код:

    SeekBar_contrast.setMax(10);
    SeekBar_contrast.setProgress((5));
         @Override
         public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {  
                if (progress <= 5) {
                    progress = 1 - progress / 5;                
                } else {
                    progress = 1 + (progress / 10) * 9 
                }
                new_bm = changeBitmapContrastBrightness(bimap, (float)(progress-1),(float)SeekBar_brightness.getProgress() - 255);
                cropImageView.setImageBitmap(new_bm);
         }

Если вы хотите сделать увеличение контраста более плавным - попробуйте использовать любую нелинейную функцию.

person Divers    schedule 28.12.2014
comment
Большое спасибо за ваше руководство для концепции линейной пропорциональности. Я разработал формулу, которая должна быть такой: `public double convert_contrast_seekbar(int progress) { double new_contrast_progress = 0.0; если (прогресс ‹= 50) { new_contrast_progress = ((двойной) прогресс) / 50; } else { new_contrast_progress = 1 + ((double) (progress-50) / 50)* 9 ; } вернуть new_contrast_progress; }` - person pearmak; 29.12.2014