Пишу простое приложение для захвата видеопотока с IPкамеры на винформах используя фреймворк AForge. Что бы код не был свалкой, вынес многие вещи в отдельную библиотеку, в том числе и захват видеопотока от камеры. Создал в классе библиотеки делегат и событие:
public event ImageWithDetectionChangedEventHandler CameraImageChanged;
public delegate void ImageWithDetectionChangedEventHandler(object sender, Bitmap img);
Так же метод для захвата:
public void CreateMjpegVideoStream(string url)
{
// Создаем MJPEG видео ресурс с удаленной камеры
MJPEGStream stream = new MJPEGStream(url);
// set event handlers
stream.NewFrame += Video_NewFrame;
stream.Start();
}
В этом методе подписался на событие:
private void Video_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
_bitmap = eventArgs.Frame;
}
А вот как пробросить изменения уже в форму? Вот так хочу запустить поток
private void btnStart_Click(object sender, EventArgs e)
{
_videoMaker.CreateMjpegVideoStream(tbEnteredUrl.Text);
_videoMaker.CameraImageChanged += CameraServiceCameraImageChanged;
}
и здесь изменять содержимое PictureBox:
private void CameraServiceCameraImageChanged(object sender, Bitmap img)
{
pbCameraStream.Image = img;
}
И чувствую, что поплыл, и не могу понять как это дело организовать. Буду благодарен за любую помощь!
Возможно вы имели ввиду получить доступ к контролу из другого потока? Установить ему Image можно так.
private void CameraServiceCameraImageChanged(object sender, Bitmap img)
{
var SetImage = new Action(() => { pbCameraStream.Image = img; });
if (pbCameraStream.InvokeRequired)
pbCameraStream.Invoke(SetImage);
else
SetImage();
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости