Ottenere una schermata ("screenshot") con Gambas
Per effettuare una schermata, ossia uno screenshot, di un'area mediante il solo codice Gambas, si potranno utilizzare alcune modalità di seguito riportate.
Uso del Metodo .Screenshot( ) della classe Desktop
Il Metodo ".Screenshot( )" della Classe Desktop, utilizzabile attivando il Componente "gb.desktop", consente di ottenere una schermata della superficie del desktop delimitata dai valori indicati nei parametri del Metodo medesimo.
Vadiamo un paio di esempi pratici:
Public Sub Button1_Click() Dim pc As Picture ' Individuiamo il riquadro interessato dallo screenshot secondo i soliti parametri: X, Y, Width, Height. ' Assegnamo, quindi, la schermata in una variabile di tipo "Picture"...: pc = Desktop.Screenshot(100, 100, 100, 100) ' ...che caricheremo in una "PictureBox" per mostrarla: PictureBox1.Picture = pc End
Mostriamo ora un esempio più complesso: determineremo con lo spostamento del mouse l'area della schermata da mostrare nella PictureBox.
Private pn As Panel Private xIniz As Integer Private yIniz As Integer Private pc As Picture Public Sub Form_MouseDown() ' Se non c'è una schermata nella "PictureBox", viene distrutta: If Not IsNull(pc) Then PictureBox1.Picture.Clear Endif ' Per definire, anche visivamente, l'area utilizzeremo un "Panel": pn = New Panel(Me) ' Raccogliamo le coordinate iniziali del mouse nel momento del clic: xIniz = Mouse.X yIniz = Mouse.Y End Public Sub Form_MouseMove() With pn .Border = Border.Plain .Width = Mouse.X - xIniz .Height = Mouse.Y - yIniz .X = xIniz ' le coordinate di partenza sono quelle impostate... .Y = yIniz ' ...con il MouseDown. End With End Public Sub Form_MouseUp() ' Effettuiamo la schermata (ossia lo "screenshot") dell'area individuata dal "Panel" dimensionato con lo spostamento del mouse. ' L'area interessata, dunque, avrà le medesime coordinate e dimensioni di quel "Panel": With pn pc = Desktop.Screenshot(.X, .Y, .W, .H) End With ' Mostriamo la picture della schermata nella "PictureBox" posta sul form: PictureBox1.Picture = pc ' Quindi salviamo da qualche parte la schermata: pc.Save("/tmp/schermata.png") pn.Delete End
Uso del Metodo .GetScreenshot( ) della Classe DesktopWindow
Quast'altra modalità prevede l'uso del Metodo ".GetScreenshot( )" della Classe "DesktopWindow", attivando il Componente "gb.desktop".
In tal caso, però, bisognerà individuare preliminarmente il numero identificativo della finestra del desktop e così passarlo all'oggetto DesktopWindow da creare.
Mostriamo un semplice esempio:
Public Sub Button1_Click() Dim dw As DesktopWindow Dim wid As Integer Dim pc As Picture ' Individua il numero identificativo della finestra del desktop... wid = Desktop.FindWindow("Scrivania", Null, Null)[0] ' ...e lo passa all'oggetto "DesktopWindow" da creare: With dw = New DesktopWindow(wid) pc = .GetScreenshot() End With pc.Save("/tmp/screenshot.png", 100) End
Uso delle risorse del Componente gb.media=
Anche il Componente gb.media può consentire di effettuare una schermata del desktop, in particolare utilizzando le risorse delle Classi "MediaPipeline", "MediaControl" e "MediaFilter".
Mostriamo un semplice esempio:
Private pl As MediaPipeline Public Sub Form_Open() Dim src, sca, con, png, snk As MediaControl Dim flt As MediaFilter pl = New MediaPipeline src = New MediaControl(pl, "ximagesrc") ' Imposta l'angolo x in alto a sinistra della schermata rispetto alla superficie del desktop: src["startx"] = 0 src["use-damage"] = 0 sca = New MediaControl(pl, "videoscale") sca["method"] = 0 ' Imposta la dimensione del file immagine finale: flt = New MediaFilter(pl, "video/x-raw,width=640,height=480") con = New MediaControl(pl, "videoconvert") png = New MediaControl(pl, "pngenc") snk = New MediaControl(pl, "filesink") snk["location"] = "/tmp/screenshot.png" ' Vengono collegati i vari plug-in di GStreamer utilizzati: src.LinkTo(sca) sca.LinkTo(flt) flt.LinkTo(con) con.LinkTo(png) png.LinkTo(snk) End Public Sub Button1_Click() ' Attende 3 secondi prima di effettuare lo "screenshot": Wait 3 ' Effettua lo "screenshot": pl.Play() ' Chiude il flusso: pl.Stop() End