视频上的文本覆盖(VB.net)

视频上的文本覆盖(VB.net),vb.net,aforge,Vb.net,Aforge,你可能在其他论坛上看到过这个问题,但我仍然无法解决这个问题。 我设法在几秒钟内获得文本覆盖,但之后它消失并显示以下图像(它不会停止程序): 当我遇到上述错误时,我有一个这样的代码: Private Sub CAPTURAR(sender As Object, eventArgs As NewFrameEventArgs) If ButtonVIDEO.BackColor = Color.Black Then 'if n ot recording......

你可能在其他论坛上看到过这个问题,但我仍然无法解决这个问题。 我设法在几秒钟内获得文本覆盖,但之后它消失并显示以下图像(它不会停止程序):

当我遇到上述错误时,我有一个这样的代码:

    Private Sub CAPTURAR(sender As Object, eventArgs As NewFrameEventArgs)

    If ButtonVIDEO.BackColor = Color.Black Then 'if n ot recording......

        BMP = DirectCast(eventArgs.Frame.Clone(), Bitmap) 'PONE LOS DATOS EN EL BITMAP
        PictureBox1.Image = DirectCast(eventArgs.Frame.Clone(), Bitmap) 'PUT THE DATA IN THE BITMAP
        BMP.Dispose()

        'insert text overlay
        If BMP IsNot Nothing Then
            Dim g As Graphics = Graphics.FromImage(PictureBox1.Image)
            g.DrawString(New String("new"), New Font("Arial", 16), Brushes.White, New Rectangle(10, 10, 200, 50))
            g.Dispose()
        End If

    Else ' SI ESTAS GRABANDO...

        BMP = DirectCast(eventArgs.Frame.Clone(), Bitmap) ' If YOU ARE RECORDING
        PictureBox1.Image = DirectCast(eventArgs.Frame.Clone(), Bitmap) 'PRESENTS THEM AT THE PICTURE BOX
        ESCRITOR.WriteVideoFrame(BMP) 'KEEP THEM IN THE MEMORY

    End If

End Sub
完整代码如下:

提前谢谢 -

2020年1月14日:更新代码,我在视频上得到了完美的覆盖:

 Private Sub ButtonVIDEO_Click(sender As System.Object, e As System.EventArgs) Handles ButtonVIDEO.Click

    If ButtonVIDEO.BackColor = Color.Black Then 'YOU ARE NOT RECORDING VIDEO
        SaveFileDialog1.DefaultExt = ".avi" 'SAVE AS AVI FILE
        If SaveFileDialog1.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
            Dim ANCHO As Integer = CAMARA.VideoResolution.FrameSize.Width 'DEFINE THE WIDTH OF THE PHOTOGRAPH
            Dim ALTO As Integer = CAMARA.VideoResolution.FrameSize.Height 'DEFINE THE HIGH OF THE PHOTOGRAPH
            'CREATE THE FILE FOR DATA WITH SAVED PARAMETERS
            ESCRITOR.Open(SaveFileDialog1.FileName, ANCHO, ALTO, NumericUpDownFPS.Value, VideoCodec.Default, NumericUpDownBRT.Value * 1000)
            ESCRITOR.WriteVideoFrame(BMP)    'START SAVING DATA
            ButtonVIDEO.BackColor = Color.Red 'SO WE KNOW THAT HE'S RECORDING

        End If

    Else
        ButtonVIDEO.BackColor = Color.Black 'YOU ARE RECORDING
        ESCRITOR.Close()    'STOP SAVING DATA
    End If


End Sub

Private Sub CAPTURAR(ByVal sender As Object, ByVal eventArgs As NewFrameEventArgs)
    Me.Invoke(CType(Function()



                        If ButtonVIDEO.BackColor = Color.Black Then 'IF YOU ARE NOT RECORDING ......

                            BMP = DirectCast(eventArgs.Frame.Clone(), Bitmap) 'PUT THE DATA IN THE BITMAP
                            PictureBox1.Image = DirectCast(eventArgs.Frame.Clone(), Bitmap) 'PRESENTS THEM AT THE PICTURE BOX

                            'insert text overlay

                        Else 'IF YOU ARE RECORDING ...
                            Try
                                BMP = DirectCast(eventArgs.Frame.Clone(), Bitmap)     'PUT THE DATA IN THE BITMAP
                                PictureBox1.Image = DirectCast(eventArgs.Frame.Clone(), Bitmap)  'PRESENTS THEM AT THE PICTURE BOX
                                ESCRITOR.WriteVideoFrame(BMP)  'KEEP THEM IN THE MEMORY
                            Catch ex As Exception
                            End Try
                        End If
                        If BMP IsNot Nothing Then
                            Dim g As Graphics = Graphics.FromImage(PictureBox1.Image)
                            g.DrawString(New String("new"), New Font("Arial", 16), Brushes.White, New Rectangle(10, 10, 200, 50))
                            g.Dispose()
                        End If
                        Me.Invoke(CType(Function()


                                        End Function, MethodInvoker))
                        GC.Collect()
                    End Function, MethodInvoker))

End Sub

你不应该有这样一个空捕获,除非你想让程序忽略任何出错的地方。注释掉Try..Catch行。看起来您忘记处理位图了,所以可能它正在填充RAM,这会干扰其操作。(有用信息:)我也试过了,但结果还是一样。请参阅我编辑的问题。当控件的OnPaint()方法遇到未经处理的异常时,会出现失败的红十字。这几乎肯定是由eventArgs.Frame.Clone()引起的,用于捕获图像的库只会创建一个临时位图,该位图会在触发事件后再次处理。使用
新位图(eventArgs.Frame)
进行深度复制。别忘了处理旧的PictureBox1.Image,否则你会很快耗尽内存。仔细想想,这是使代码崩溃的最可能的方法。所以你需要
如果PictureBox1.Image不是空的,那么在作业之前处理(PictureBox1.Image)
。我想你的建议和我现在问题中关于代码的建议是一样的?我确实试着在作业之前处理,但结果是一样的