Изменение яркости веб-камеры из другой формы с помощью трекбара в winforms

#c# #winforms #trackbar

Вопрос:

Я пытаюсь изменить яркость веб-камеры в форме 2 с помощью панели треков в форме 3. Я не могу отправить его значение или не могу использовать его в форме 2. Поскольку я планирую разработать пользовательский интерфейс, мне нужно добиться этого таким образом. Можете ли вы помочь мне достичь этого?

Это мой код формы 2 ниже.

     using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

using AForge.Video;
using AForge.Video.DirectShow;
using AForge.Imaging.Filters;


namespace MUI
{
    public partial class Form2 : Form
    {

       
        public Form2()
        {
            InitializeComponent();
        }

        FilterInfoCollection filterInfoCollection;
        VideoCaptureDevice videoCaptureDevice;

        

        #region Webcam Frames
        private void button1_Click_1(object sender, EventArgs e)
        {
            Form3 f3 = new Form3();
            videoCaptureDevice = new VideoCaptureDevice(filterInfoCollection[comboBox1.SelectedIndex].MonikerString);
            videoCaptureDevice.NewFrame  = videoCaptureDevice_NewFrame;
            videoCaptureDevice.NewFrame  = f3.videoCaptureDevice_NewFrame;
            videoCaptureDevice.Start();
           
            f3.Show();
        }
        #endregion

        

        #region Bitmap Creating
        public void videoCaptureDevice_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            pictureBox1.Image = (Bitmap)eventArgs.Frame.Clone();

        }
        #endregion
      

        #region Device List
        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();

        }
        #endregion

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

Это мой код формы 3 ниже.

     using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using AForge.Video;
using AForge.Video.DirectShow;
using AForge.Imaging.Filters;

namespace MUI
{
    
    public partial class Form3 : Form
    {
        
        public Form3()
        {
            InitializeComponent();
        }

        
        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            Form2 f2 = new Form2();

            label6.Text = trackBar1.Value.ToString();
            if (f2.pictureBox1.Image != null)
            {


                BrightnessCorrection brightness = new BrightnessCorrection(trackBar1.Value);
                f2.pictureBox1.Image = brightness.Apply((Bitmap)f2.pictureBox1.Image.Clone());
            }
        }
    }
}
 

Комментарии:

1. docs.microsoft.com/en-us/dotnet/standard/events

2. Удалите это: Form2 f2 = new Form2(); для начала. Вместо установки Image свойства элемента управления в обработчике событий, который обрабатывает события, НЕ возникающие в потоке пользовательского интерфейса, используйте объект класса, предоставляющий растровый объект. Установите этот объект в новый кадр и установите PictureBox.Image свойство для этого растрового изображения. Когда кадр изменится, задайте растровому объекту новое значение и Invalidate() свой PictureBox. Используйте свою рутину для изменения яркости одного и того же растрового объекта. Вероятно, потребуется какая-то блокировка.