为什么我的颜色选择器无法使用不透明度

问题描述 投票:0回答:1

我的颜色选择器遇到问题,调整不透明度似乎无法正常工作。它不会按预期将不透明度设置应用于所选颜色,而是在调整不透明度之前始终将颜色变为白色。这导致不透明度设置不会影响我按照我想要的方式选择的颜色。本质上,尽管我努力修改不透明度,但所选颜色并未准确反映这些变化。

这是我的不透明度代码并将颜色保存到面板。 。 .

namespace System_Tools
{
    public partial class colorpickerPage : UserControl
    {
        private Color selectedColor = Color.White; 

        public colorpickerPage()
        {
            InitializeComponent();
            colorWheelPictureBox.MouseClick += colorWheelPictureBox_MouseClick;
            opacityTrackBar.Scroll += opacityTrackBar_Scroll;
            UpdateColorDisplays(selectedColor);
        }

        private Form1 parentForm;

        public void SetParentForm(Form1 form)
        {
            parentForm = form;
        }

        public string ColorToHex(Color color)
        {
            return $"#{color.R:X2}{color.G:X2}{color.B:X2}";
        }

        public string ColorToHSV(Color color)
        {
            double hue = color.GetHue();
            double saturation = color.GetSaturation();
            double brightness = color.GetBrightness();
            return $"{hue:F2}, {saturation:F2}, {brightness:F2}";
        }

        public string ColorToHSL(Color color)
        {
            double r = color.R / 255.0;
            double g = color.G / 255.0;
            double b = color.B / 255.0;

            double max = Math.Max(r, Math.Max(g, b));
            double min = Math.Min(r, Math.Min(g, b));

            double h = color.GetHue();
            double l = (max + min) / 2.0;
            double s = (max == min) ? 0 : (l <= 0.5 ? (max - min) / (max + min) : (max - min) / (2 - max - min));

            return $"{h:F2}, {s:F2}, {l:F2}";
        }

        public string ColorToCMYK(Color color)
        {
            float r = color.R / 255f;
            float g = color.G / 255f;
            float b = color.B / 255f;

            float k = 1 - Math.Max(r, Math.Max(g, b));
            float c = (1 - r - k) / (1 - k);
            float m = (1 - g - k) / (1 - k);
            float y = (1 - b - k) / (1 - k);

            return $"{c:F2}, {m:F2}, {y:F2}, {k:F2}";
        }

        private void colorWheelPictureBox_MouseClick(object sender, MouseEventArgs e)
        {
            Bitmap bitmap = new Bitmap(colorWheelPictureBox.Image);
            Color selectedColor = bitmap.GetPixel(e.X, e.Y);
            UpdateColorDisplays(selectedColor);

            if (selectedColor.A != 0)
            {
                hexTextBox.Text = ColorToHex(selectedColor);
                rgbTextBox.Text = $"{selectedColor.R}, {selectedColor.G}, {selectedColor.B}";
                hsvTextBox.Text = ColorToHSV(selectedColor);
                hslTextBox.Text = ColorToHSL(selectedColor);
                cmykTextBox.Text = ColorToCMYK(selectedColor);
            }
        }

        private void opacityTrackBar_Scroll(object sender, EventArgs e)
        {
            UpdateColorDisplays(selectedColor);
        }

        private void UpdateColorDisplays(Color color)
        {
            hexTextBox.Text = ColorToHex(color);
            rgbTextBox.Text = $"{color.R}, {color.G}, {color.B}, {color.A}";
            hsvTextBox.Text = ColorToHSV(color);
            hslTextBox.Text = ColorToHSL(color);
            cmykTextBox.Text = ColorToCMYK(color);

            float opacity = opacityTrackBar.Value / 255f;

            Color blendedColor = Color.FromArgb((int)(color.A * opacity), color.R, color.G, color.B);

            colorDisplayPanel.BackColor = blendedColor;
        }
    }
}

我期待它,因为它会改变颜色的不透明度。

c# .net
1个回答
0
投票

colorWheelPictureBox_MouseClick()
中,您声明了一个名为
selectedColor
的 LOCAL 变量,它隐藏了您的类变量。

这意味着在

opacityTrackBar_Scroll()
中它将变回白色,因为类变量永远不会更改为所选颜色...

改变:

    private void colorWheelPictureBox_MouseClick(object sender, MouseEventArgs e)
    {
        Bitmap bitmap = new Bitmap(colorWheelPictureBox.Image);
        Color selectedColor = bitmap.GetPixel(e.X, e.Y);
        UpdateColorDisplays(selectedColor);

        // ... more code ...

    }

致:

    private void colorWheelPictureBox_MouseClick(object sender, MouseEventArgs e)
    {
        Bitmap bitmap = new Bitmap(colorWheelPictureBox.Image);
        selectedColor = bitmap.GetPixel(e.X, e.Y);
        UpdateColorDisplays(selectedColor);

        // ... more code ...

    }
© www.soinside.com 2019 - 2024. All rights reserved.