You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinForm中通过Form3的TrackBar调整Form2摄像头亮度的实现问题

WinForm跨窗体调整摄像头亮度实现方案

核心问题

  1. Form3滑块事件中每次new Form2()生成的是全新的窗体实例,和当前正在运行、显示摄像头画面的Form2实例没有关联,修改该实例控件不会生效
  2. 直接修改Form2的PictureBox图像会被摄像头每秒触发的NewFrame事件的原始帧覆盖,调整效果无法持续

代码修改

第一步:修改Form2代码

  1. 新增公共亮度属性,用于接收Form3传递的滑块值
  2. 将亮度调整逻辑嵌入新帧处理流程,每帧都应用当前亮度值
  3. 打开Form3时将当前Form2实例传递给Form3

完整修改后的Form2核心代码:

namespace MUI
{
    public partial class Form2 : Form
    {
        // 新增:公共亮度属性,供Form3修改
        public int BrightnessValue { get; set; } = 0;

        public Form2()
        {
            InitializeComponent();
        }

        FilterInfoCollection filterInfoCollection;
        VideoCaptureDevice videoCaptureDevice;

        private void button1_Click_1(object sender, EventArgs e)
        {
            // 修改:将当前Form2实例传入Form3构造函数
            Form3 f3 = new Form3(this);
            videoCaptureDevice = new VideoCaptureDevice(filterInfoCollection[comboBox1.SelectedIndex].MonikerString);
            videoCaptureDevice.NewFrame += videoCaptureDevice_NewFrame;
            videoCaptureDevice.NewFrame += f3.videoCaptureDevice_NewFrame;
            videoCaptureDevice.Start();
           
            f3.Show();
        }

        public void videoCaptureDevice_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            // 修改:每帧应用当前亮度值再赋值给PictureBox
            Bitmap rawFrame = (Bitmap)eventArgs.Frame.Clone();
            if (BrightnessValue != 0)
            {
                BrightnessCorrection brightness = new BrightnessCorrection(BrightnessValue);
                rawFrame = brightness.Apply(rawFrame);
            }
            pictureBox1.Image = rawFrame;
        }

        // 其余原有代码无需改动
        public void Form2_Load(object sender, EventArgs e)
        {
            filterInfoCollection = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            foreach (FilterInfo filterInfo in filterInfoCollection)
            {
                comboBox1.Items.Add(filterInfo.Name);
            }
            comboBox1.SelectedIndex = 0;
            videoCaptureDevice = new VideoCaptureDevice();
        }

        private void Form2_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (videoCaptureDevice.IsRunning == true)
            {
                videoCaptureDevice.Stop();
                pictureBox1.Image = null;
            }
        }
    }
}

第二步:修改Form3代码

  1. 新增构造函数接收Form2实例,存储为私有字段
  2. 滑块滚动时仅修改Form2的亮度属性即可,无需自行处理图像

完整修改后的Form3代码:

namespace MUI
{
    public partial class Form3 : Form
    {
        // 新增:存储传入的Form2实例
        private Form2 _form2;

        // 修改:新增带Form2参数的构造函数
        public Form3(Form2 form2)
        {
            InitializeComponent();
            _form2 = form2;
        }

        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            label6.Text = trackBar1.Value.ToString();
            // 直接修改关联的Form2实例的亮度属性即可
            _form2.BrightnessValue = trackBar1.Value;
        }

        // 原有videoCaptureDevice_NewFrame方法保留即可
        public void videoCaptureDevice_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            // 原有逻辑无需改动
        }
    }
}

生效说明

调整Form3滑块时,会实时修改正在运行的Form2实例的亮度参数,摄像头每生成新帧都会自动应用该亮度值再渲染到画面,调整效果持续生效,符合要求的交互逻辑。


内容的提问来源于stack exchange,提问作者Ezgi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 08:15:02