Logo UGIdotNET

Discussione 'AudioVideoPlayback e BitBlt'

# Pubblicato il 30 lug 2004 2.44 - Rispondi
Marco Assandri
AudioVideoPlayback e BitBlt
Ciao a tutti,
devo creare un'applicazione che visualizza in una pictureBox filmati avi o filmati live da webcam e che, a richiesta, fa uno snapshot di una parte del frame corrente e lo mette in un altra pictureBox.

Il codice iniziale che ho scritto al momento per provare è il seguente:

Imports System.Drawing.Drawing2D
Imports Microsoft.DirectX.AudioVideoPlayback

Public Class Form1
Inherits System.Windows.Forms.Form

#Region " Windows Form Designer generated code "
#End Region

Declare Auto Function BitBlt Lib "GDI32.DLL" ( _
ByVal hdcDest As IntPtr, _
ByVal nXDest As Integer, _
ByVal nYDest As Integer, _
ByVal nWidth As Integer, _
ByVal nHeight As Integer, _
ByVal hdcSrc As IntPtr, _
ByVal nXSrc As Integer, _
ByVal nYSrc As Integer, _
ByVal dwRop As Int32) As Boolean

Dim vi As Video = Nothing

Private Sub srcDraw_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles srcDraw.Click
vi = New Video("Un file avi a caso.avi")
vi.Owner = src 'src è una picturebox
vi.Play()
End Sub

Private Function copyRect(ByVal src As PictureBox, ByVal rect As RectangleF) As Bitmap
Dim srcPic As Graphics = src.CreateGraphics 'Get a Graphics Object from the form
Dim srcBmp As New Bitmap(src.Width, src.Height, srcPic) 'Create a EMPTY bitmap from that graphics
Dim srcMem As Graphics = Graphics.FromImage(srcBmp) 'Create a Graphics object in memory from that bitmap
Dim HDC1 As IntPtr = srcPic.GetHdc 'get the IntPtr's of the graphics
Dim HDC2 As IntPtr = srcMem.GetHdc 'get the IntPtr's of the graphics

'get the picture
BitBlt(HDC2, 0, 0, rect.Width, rect.Height, HDC1, rect.X, rect.Y, 13369376)

'Clone the bitmap so we can dispose this one
copyRect = srcBmp.Clone()

'Clean Up
srcPic.ReleaseHdc(HDC1)
srcMem.ReleaseHdc(HDC2)
srcPic.Dispose()
srcMem.Dispose()
srcMem.Dispose()
End Function

Private Sub dstCopy_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles dstCopy.Click
'dest è la pictureBox in cui copio la parte dell'immagine
dest.Image = CType(copyRect(src, New RectangleF(10, 10, 50, src.Height)), Bitmap).Clone
End Sub

End Class

Il problema è che questo codice non mi copia niente. O meglio, mi copia se effettivamente la pictureBox è riempita con una immagine o altro oggetto graphics, ma quando è occupata dall'avi non avviene nessuna copia.

Stranamente se dichiaro l'oggetto vi all'interno della sub srcDraw.Click e clicco due volte sul pulsante che scatena l'evento srcdraw.click allora la copia avviene correttamente.

Come mai succede così e come posso rimediare secondo voi?

Grazie a tutti per l'aiuto.
# Pubblicato il 31 lug 2004 13.38 - Rispondi
Raffaele Rialdi
Re: AudioVideoPlayback e BitBlt
> Il problema è che questo codice non mi copia niente. O meglio, mi copia se
> effettivamente la pictureBox è riempita con una immagine o altro oggetto
> graphics, ma quando è occupata dall'avi non avviene nessuna copia.

DirectX lavora in overlay con la memoria dell'acceleratore grafico mentre GDI e GDI+ hanno una gestione (più lenta) e completamente diversa.
Credo tu debba usare le funzioni di DirectX per farti dare un frame da mostrare nella picturebox.

Raffaele

© 2001 User Group Italiano UGIdotNET. Tutti i diritti riservati. Note legali. - Partita IVA 01927050185