视频上的文本覆盖(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)
。我想你的建议和我现在问题中关于代码的建议是一样的?我确实试着在作业之前处理,但结果是一样的