Estrarre e salvare singole immagini durante l'esecuzione di un file video mediante il Componente gb.media

Da Gambas-it.org - Wikipedia.

Per estrarre e salvare mediante il Componente gb.media singole immagini da un file video durante la sua esecuzione all'interno di un Oggetto DrawingArea, si posono adottare almeno tre modalità.


Uso delle sole risorse del Componente gb.media

Usando le sole risorse del Componente gb.media, per catturare singole immagini, si farà uso della sotto-proprietà ".Image" della proprietà "Video" della Classe MediaPlayer.

Mostriamo un esempio pratico, nel quale si farà uso di una DrawingArea, nella quale sarà mostrato il video:

Private mp As MediaPlayer
Private i As Integer


Public Sub Form_Open()

 Dim da As DrawingArea
    
' Crea una "DrawingArea" come oggetto GUI da usare per l'uscita video:
  With da = New DrawingArea(Me)
    .X = 10
    .Y = 10
    .W = 300
    .H = 300
    .Background = Color.Black
  End With
  
  With mp = New MediaPlayer
    .URL = Media.URL("/percorso/del/file/video")
' Imposta il controllo dell'uscita video da usare:
    .SetWindow(da)
  End With
  
End


Public Sub Button1_Click()

' Esegue il file video:
  mp.Play()
  
  Do
' Una brevissima pausa consente di mostrare e di agire sugli eventuali oggetti posti sul Form:
    Wait 0.01
    Label1.Text = "\rDurata del video: " & CStr(Date(0, 0, 0, 0, 0, 0, mp.Duration * 1000)) & "   -   Tempo trascorso: " & CStr(Date(0, 0, 0, 0, 0, 0, mp.Position * 1000))
  Loop Until mp.Position >= mp.Duration
  
End


Public Sub Button2_Click()
 
  mp.Stop
  mp.Close
  
End


Public Sub ToggleButton1_Click()
 
  If ToggleButton1.Value Then
    mp.Pause
  Else
    mp.Play
  Endif
  
End


Public Sub Button3_Click()

 Dim img As Image
 Dim s As String
  
  img = mp.Video.Imag
  Inc i
  s = CStr(i)
  img.Save("/tmp/foto_" & s & ".png", 100)
  
  Write #File.out, "\rImmagine catturata: " & s
  
End


Uso della Classe DesktopWindow

Si potrà fare uso anche del Metodo ".GetScreenshot( )" della Classe "DesktopWindow". Bisognerà attivare anche i Componenti "gb.desktop" e "gb.desktop.x11".


Mostriamo un esempio pratico:

Private mp As MediaPlayer
Private da As DrawingArea
Private pc As New Picture[]
 

Public Sub Form_Open()
 
' Crea una "DrawingArea" come oggetto GUI da usare per l'uscita video:
 With da = New DrawingArea(Me)
   .X = 10
   .Y = 10
   .W = 480
   .H = 320
   .Background = Color.Black
 End With
 
 With mp = New MediaPlayer
   .URL = Media.URL("/percorso/del/file/video")
' Imposta il controllo dell'uscita video da usare:
   .SetWindow(da)
 End With
 
End


Public Sub Button1_Click()
 
' Avvia l'esecuzione del video:
 mp.Play()
  
End


Public Sub Button2_Click()
 
 Dim dw As DesktopWindow
  
  dw = New DesktopWindow(da.Handle)
  
' Cattura una schermata del contenuto video mostrato in quel momento dalla "DrawingArea":
  pc.Push(dw.GetScreenshot(True))
  
End


Public Sub Button3_Click()   

 Dim i As Integer
 Dim drc, s As String
 
' Arresta l'esecuzione del file video nella "DrawingArea":
  mp.Stop()
 
  drc = "/tmp/imago"
  
  If Not Exist(drc) Then
    Mkdir drc
  Else
    For Each s In Dir(drc, "picture_*", gb.file)
      Kill drc &/ s
    Next
  Endif
  
' Genera infine i vari file immagine di formato .png:
  For i = 0 To pc.Max
    pc[i].Save(drc &/ "picture_" & CStr(i) & ".png", 100)
  Next
  
End


Uso della Classe Desktop

Si potrà anche fare uso del Metodo ".Screenshot( )" della Classe "Desktop". Anche in questo caso bisognerà attivare i Componenti "gb.desktop" e "gb.desktop.x11".
Facendo riferimento all'esempio di codice precedente, la sub-routine dell'evento "Button2_Click( )" dovrà essere modificata come segue:

Public Sub Button2_Click()
  
' Cattura una schermata del contenuto video mostrato in quel momento dalla "DrawingArea":
  pc.Push(Desktop.Screenshot(da.ScreenX, da.ScreenY, da.W, da.H))
  
End