WinForm中通过Form3的TrackBar调整Form2摄像头亮度的实现问题
WinForm跨窗体调整摄像头亮度实现方案
核心问题
- Form3滑块事件中每次
new Form2()生成的是全新的窗体实例,和当前正在运行、显示摄像头画面的Form2实例没有关联,修改该实例控件不会生效 - 直接修改Form2的PictureBox图像会被摄像头每秒触发的
NewFrame事件的原始帧覆盖,调整效果无法持续
代码修改
第一步:修改Form2代码
- 新增公共亮度属性,用于接收Form3传递的滑块值
- 将亮度调整逻辑嵌入新帧处理流程,每帧都应用当前亮度值
- 打开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代码
- 新增构造函数接收Form2实例,存储为私有字段
- 滑块滚动时仅修改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
相关产品推荐
相关产品推荐

