TrackBar Brightness Control не прокручивает весь диапазон цветов от черного до белого

У меня есть трекбар, который регулирует яркость цвета фона формы. Со временем я изменю его, чтобы настроить яркость изображения. Если вы посмотрите, как работает ползунок яркости в элементе управления Microsoft colorDialog, при перемещении вверх и вниз значение меняется с белого на черный, но в середине оттенок исходного цвета никогда не теряется. Первоначально я терял оттенок и просто настраивал оттенки серого, но наконец-то нашел решение для этого.

Моя текущая проблема заключается в том, что я не могу настроить весь диапазон цветов. Например, при выборе цвета R 192, G 128, B 255, я могу прокрутить весь путь до черного и полностью вернуться к исходному цвету, но не могу прокрутить до белого. Я работаю над этим кодом несколько часов в день в течение 10 дней, и либо меняю цвет с черного на белый и теряю оттенок (что решено), либо получаю текущую проблему: я могу прокрутить от лавендара до черного до лавендара, но не могу прокрутить до белого. Я глубоко признателен за некоторую помощь. Спасибо.

public partial class Form1 : Form
{

   double xRed, xGreen, xBlue, xColor; 
   bool count = true;

    private void Form1_BackColorChanged(object sender, EventArgs e)
    {
        //Do this once, when user sets a new BG color 
        if (count == true)
        {                     
            //Get a % of the color value instead of the absolute value,  when using absolute value, if it goes down near 0, or up near 255, hue is lost.  
            xRed = (double) this.BackColor.R / 255; 
            xGreen = (double) this.BackColor.G / 255; 
            xBlue = (double) this.BackColor.B / 255;

            xColor = (((xRed + xGreen + xBlue) * 255 ) / 3); 
            xColor = Math.Round(xColor, 0);

            //Label is just so I can see RGB and trackBar values 
            lblBGColor.Enabled = true; 
            trackBar1.Enabled = true; 
            trackBar1.Value = (int)xColor; 
            label1.Text = Convert.ToString(trackBar1.Value);
            count = false; 
        }      
    }

    private void trackBar1_Scroll(object sender, EventArgs e)
    {
        double bgRed = 0, bgGreen = 0, bgBlue = 0;
        //Once it goes down to black or up to white, restore the hue value as a percent. Percent of R (value / 255), Percent of G (value / 255), Percent of B (value / 255). SO if red is 196 and 196 is 80% of 255, red is 80% of trackbar value, if green is 128 and 128 is 50% of 255, green is 50% of trackbar value, etc... 

        //I suspect the problem is here, with trackBar1.Value.  I also tried adding the trackBar1.Value change since last scroll, but that didn't help.  Also tried setting trackBar1.Value to 128, but no help.  
        bgRed = xRed * trackBar1.Value;
        bgGreen = xGreen * trackBar1.Value; 
        bgBlue = xBlue * trackBar1.Value; 

        bgRed = Math.Round(bgRed, 0);
        bgGreen = Math.Round(bgGreen, 0);
        bgBlue = Math.Round(bgBlue, 0); 

        if (bgRed > 255)
            bgRed = 255;
        if (bgGreen > 255)
            bgGreen = 255;
        if (bgBlue > 255)
            bgBlue = 255;

        //Avoid unneeded looping through BackColorChanged event   
        count = false;  
        //Set form and label values 
        this.BackColor = Color.FromArgb(255, (int)bgRed, (int)bgGreen, (int)bgBlue); 
        label1.Text = Convert.ToString((int)bgRed + " " + (int)bgGreen + " " + (int)bgBlue + " trackBar: " + trackBar1.Value); 
}

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

1 ответ

В вашем коде переменные xRed, xGreen and xBlue будет назначено значение в зависимости от значения rgb цвета фона формы. Например, если цвет фона формы имеет значение RGB (150, 170 и 180), тогда xRed будет 0,588, G будет 0,667, а B будет 0,705.

Когда вы перемещаете трекбар до максимума (скажем, 255), тогда цвет фона вашей формы будет bgRed = xRed * trackBar1.value (150), bgGreen будет 170, а bgBlue будет 180, что является исходным цветом фона формы.

На мой взгляд, отображение оригинального цвета при яркости 100% - правильное поведение. Если вы хотите отобразить белый цвет в качестве фона на 100%, вы должны изменить свой код на что-то вроде ниже

private void trackBar1_Scroll(object sender, EventArgs e)
    {
        double bgRed = 0, bgGreen = 0, bgBlue = 0;
        if(this.trackBar1.value==this.trackBar1.Maximum)
        {
            bgRed=255;
            bgGreen=255;
            bgBlue=255;
        }

       else{
            //Once it goes down to black or up to white, restore the hue value as a percent. Percent of R (value / 255), Percent of G (value / 255), Percent of B (value / 255). SO if red is 196 and 196 is 80% of 255, red is 80% of trackbar value, if green is 128 and 128 is 50% of 255, green is 50% of trackbar value, etc... 
        //I suspect the problem is here, with trackBar1.Value.  I also tried adding the trackBar1.Value change since last scroll, but that didn't help.  Also tried setting trackBar1.Value to 128, but no help.  
        bgRed = xRed * trackBar1.Value;
        bgGreen = xGreen * trackBar1.Value; 
        bgBlue = xBlue * trackBar1.Value; 

        bgRed = Math.Round(bgRed, 0);
        bgGreen = Math.Round(bgGreen, 0);
        bgBlue = Math.Round(bgBlue, 0); 

        if (bgRed > 255)
            bgRed = 255;
        if (bgGreen > 255)
            bgGreen = 255;
        if (bgBlue > 255)
            bgBlue = 255;
    }
    //Avoid unneeded looping through BackColorChanged event   
    count = false;  
    //Set form and label values 
    this.BackColor = Color.FromArgb(255, (int)bgRed, (int)bgGreen, (int)bgBlue); 
    label1.Text = Convert.ToString((int)bgRed + " " + (int)bgGreen + " " + (int)bgBlue + " trackBar: " + trackBar1.Value); 
}
Другие вопросы по тегам