| 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. |
| 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 |