Differenze tra le versioni di "Ottenere un'immagine del Form"
(16 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 1: | Riga 1: | ||
− | Per ottenere un'immagine del ''Form'', comprensivo di ogni Oggetto grafico ''figlio'' in esso contenuto, è possibile adottare | + | Per ottenere un'immagine del ''Form'', comprensivo di ogni Oggetto grafico ''figlio'' in esso contenuto, è possibile adottare alcune modalità. <SUP>[[[#Note|nota 1]]]</sup> |
− | == | + | ==Usando la Classe ''Paint''== |
− | + | Nel seguente esempio pratico si hanno sul ''Form'' (Contenitore) due ''Label'' e un ''Button''. Si intende ottenere un file immagine di quanto appare nel ''Form''. | |
+ | Private lb1 As Label | ||
+ | Private lb2 As Label | ||
+ | Private Button1 As Button | ||
+ | |||
+ | |||
+ | Public Sub _new() | ||
+ | |||
+ | With Me | ||
+ | .Center | ||
+ | .W = 700 | ||
+ | .H = 600 | ||
+ | .Background = Color.Background | ||
+ | End With | ||
+ | With lb1 = New Label(Me) | ||
+ | .X = 100 | ||
+ | .Y = 100 | ||
+ | .W = 100 | ||
+ | .H = 50 | ||
+ | .Background = Color.Red | ||
+ | .Foreground = Color.Yellow | ||
+ | .Alignment = Align.Center | ||
+ | .Text = "Label rossa" | ||
+ | End With | ||
+ | With lb2 = New Label(Me) | ||
+ | .X = 200 | ||
+ | .Y = 200 | ||
+ | .W = 100 | ||
+ | .H = 50 | ||
+ | .Background = Color.Yellow | ||
+ | .Foreground = Color.Red | ||
+ | .Alignment = Align.Right | ||
+ | .Text = "Label gialla" | ||
+ | End With | ||
+ | With Button1 = New Button(Me) As "Button1" | ||
+ | .W = 60 | ||
+ | .H = 60 | ||
+ | .X = Me.W - (Button1.W * 2) | ||
+ | .Y = Me.H - (Button1.H * 2) | ||
+ | End With | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub Button1_Click() | ||
+ | |||
+ | Dim ob As Object | ||
+ | Dim im As Image | ||
+ | |||
+ | <FONT Color=gray>' ''Si crea la superficie dell'immagine che dovrà contenere la riproduzione grafica di quanto presente sul Form:''</font> | ||
+ | im = New Image(Me.W, Me.H, Me.Background, Image.Standard) | ||
+ | |||
+ | With Paint | ||
+ | .Begin(im) | ||
+ | For Each ob In Me.Children | ||
+ | <FONT Color=gray>' ''Il colore, con il quale saranno stampati i due oggetti "Label", lo ricaviamo dal colore di sfondo di ciascun Oggetto:''</font> | ||
+ | .Brush = .Color(ob.Background) | ||
+ | <FONT Color=gray>' ''Sarà stampato il contenuto presente nel rettangolo di coordinate e dimensioni uguali a quelle dell'oggetto da stampare:''</font> | ||
+ | .Rectangle(ob.X, ob.Y, ob.W, ob.H) | ||
+ | .Fill | ||
+ | <FONT Color=gray>' ''Ora viene impostato il colore del testo:''</font> | ||
+ | .Brush = .Color(ob.Foreground) | ||
+ | <FONT Color=gray>' ''Viene impostato il testo con le caratteristiche originarie degli Oggetti:''</font> | ||
+ | .Text(ob.Text, ob.X, ob.Y, ob.W, ob.H) | ||
+ | .Fill | ||
+ | Next | ||
+ | .End | ||
+ | End With | ||
+ | |||
+ | im.Save("/tmp/immagine.png", 100) | ||
+ | |||
+ | End | ||
− | |||
− | Nell'esempio pratico che segue, porremo sul ''Form'' un ''TextBox, una ''PictureBox'', per far mostrare un qualsiasi file immagine, e un ''Button''. Si provvederà a effettuare la schermata del ''Form'', pochissimo tempo dopo che questo si sarà attivato. | + | ==Uso del Metodo ".Screenshot()" della Classe ''Desktop''== |
− | + | La prima modalità prevede l'uso del Metodo ".Screenshot()" della Classe ''Desktop''. Pertanto è necessario attivare anche i Componenti ''gb.desktop'' e ''gb.desktop.x11'' di Gambas. | |
+ | |||
+ | Con il Metodo ".Screenshot()" si otterrà una ''Picture'' dell'Oggetto grafico (il ''Form'' in tal caso) posto a una distanza x, y dall'angolo alto sinistro dello schermo. | ||
+ | |||
+ | Nell'esempio pratico che segue, porremo sul ''Form'' un ''TextBox'', una ''PictureBox'', per far mostrare un qualsiasi file immagine, e un ''Button''. Si provvederà a effettuare la schermata del ''Form'', pochissimo tempo dopo che questo si sarà attivato. | ||
+ | Public Sub Form_Open() | ||
TextBox1.Text = "Gambas" | TextBox1.Text = "Gambas" | ||
− | PictureBox1.Picture = Picture.Load("<FONT Color= | + | PictureBox1.Picture = Picture.Load("<FONT Color=darkgreen>''/percorso/del/file/immagine''</font>") |
Button1.Foreground = Color.Red | Button1.Foreground = Color.Red | ||
Button1.Text = "Gambas" | Button1.Text = "Gambas" | ||
− | + | End | |
+ | |||
− | + | Public Sub Button1_Click() | |
Dim pc As Picture | Dim pc As Picture | ||
− | |||
− | |||
− | |||
<FONT Color=gray>' ''Effettua la schermata del Form, generando un Oggetto di tipo "Picture":''</font> | <FONT Color=gray>' ''Effettua la schermata del Form, generando un Oggetto di tipo "Picture":''</font> | ||
Riga 29: | Riga 102: | ||
<FONT Color=gray>' ''Salva la schermata in un file immagine di tipo "png":''</font> | <FONT Color=gray>' ''Salva la schermata in un file immagine di tipo "png":''</font> | ||
pc.Save("/tmp/test.png", 100) | pc.Save("/tmp/test.png", 100) | ||
− | + | ||
− | + | Print "Immagine acquisita !" | |
+ | |||
+ | End | ||
− | ==Uso del Metodo ". | + | ==Uso del Metodo ".GetScreenshot()" della Classe ''DesktopWindow''== |
− | La seconda malità prevede l'uso del Metodo ". | + | La seconda malità prevede l'uso del Metodo ".GetScreenshot()" della Classe ''DesktopWindow''. Pertanto è necessario attivare anche i Componenti ''gb.desktop'' e ''gb.desktop.x11'' di Gambas. |
− | Con il Metodo ". | + | Con il Metodo ".GetScreenshot()" si otterrà una ''Picture'' dell'Oggetto grafico (il ''Form'' in tal caso) posto a una distanza x, y dall'angolo alto sinistro dello schermo. |
Nell'esempio pratico che segue, porremo sul ''Form'' un ''TextBox'', una ''PictureBox'', per far mostrare un qualsiasi file immagine, e un ''Button''. Anche in questo caso si provvederà a effettuare la schermata del ''Form'', pochissimo tempo dopo che questo si sarà attivato. | Nell'esempio pratico che segue, porremo sul ''Form'' un ''TextBox'', una ''PictureBox'', per far mostrare un qualsiasi file immagine, e un ''Button''. Anche in questo caso si provvederà a effettuare la schermata del ''Form'', pochissimo tempo dopo che questo si sarà attivato. | ||
− | + | Public Sub Form_Open() | |
− | + | TextBox1.Text = "Gambas" | |
− | + | PictureBox1.Picture = Picture.Load("<FONT Color=darkgreen>''/percorso/del/file/immagine''</font>") | |
− | + | Button1.Foreground = Color.Red | |
− | + | Button1.Text = "Gambas" | |
− | + | ||
− | + | End | |
− | + | ||
+ | Public Sub Button1_Click() | ||
− | + | Dim dw As DesktopWindow | |
− | + | Dim pc As Picture | |
− | + | ||
− | |||
− | |||
− | |||
<FONT Color=gray>' ''Genera una variabile di tipo "DesktopWindow" che punta al Form, avendo individuato il numero identificativo della finestra del Form medesimo:''</font> | <FONT Color=gray>' ''Genera una variabile di tipo "DesktopWindow" che punta al Form, avendo individuato il numero identificativo della finestra del Form medesimo:''</font> | ||
− | + | With dw = New DesktopWindow(Me.Id) | |
<FONT Color=gray>' ''Effettua la schermata del Form, generando un Oggetto di tipo "Picture":''</font> | <FONT Color=gray>' ''Effettua la schermata del Form, generando un Oggetto di tipo "Picture":''</font> | ||
− | + | pc = .GetScreenshot(True) | |
− | + | End With | |
− | + | ||
<FONT Color=gray>' ''Salva la schermata in un file immagine di tipo "png":''</font> | <FONT Color=gray>' ''Salva la schermata in un file immagine di tipo "png":''</font> | ||
− | + | pc.Save("/tmp/test.png", 100) | |
− | + | ||
− | + | Print "Immagine acquisita" | |
+ | |||
+ | End | ||
Riga 72: | Riga 147: | ||
Mostriamo un esempio pratico: | Mostriamo un esempio pratico: | ||
− | + | Public Sub Form_Open() | |
+ | |||
+ | Dim r, c As Byte | ||
+ | |||
+ | With GridView1 | ||
+ | .Rows.Count = 5 | ||
+ | .Columns.Count = 5 | ||
+ | End With | ||
− | + | For r = 0 To 4 | |
+ | For c = 0 To 4 | ||
+ | GridView1[r, c].Text = "abcde" | ||
+ | Next | ||
+ | Next | ||
− | + | End | |
− | |||
− | |||
− | End | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
Public Sub Button1_Click() | Public Sub Button1_Click() | ||
− | + | Dim pl As MediaPipeline | |
− | + | Dim src, vdc, enc, snk As MediaControl | |
− | |||
− | |||
− | |||
− | + | pl = New MediaPipeline | |
− | + | src = New MediaControl(pl, "ximagesrc") | |
− | + | src["xid"] = Me.Id | |
− | + | vdc = New MediaControl(pl, "videoconvert") | |
− | + | enc = New MediaControl(pl, "pngenc") | |
− | + | snk = New MediaControl(pl, "filesink") | |
− | + | snk["location"] = "/tmp/immagine.png" | |
− | + | src.LinkTo(vdc) | |
− | + | vdc.LinkTo(enc) | |
− | + | enc.LinkTo(snk) | |
− | + | pl.Play() | |
− | + | Repeat | |
− | + | Wait 0.01 | |
− | + | Until Right(File.Load("/tmp/immagine.png"), SizeOf(gb.Integer)) = MkInt(&826042AE) | |
− | + | pl.Stop() | |
− | + | pl.Close() | |
− | + | Print "Cattura immagine effettuata" | |
− | |||
− | |||
− | |||
End | End | ||
− | |||
Riga 183: | Riga 252: | ||
− | + | Public Sub Form_Open() | |
TextBox1.Text = "Gambas" | TextBox1.Text = "Gambas" | ||
− | PictureBox1.Picture = Picture.Load("<FONT Color= | + | PictureBox1.Picture = Picture.Load("<FONT Color=darkgreen>''/percorso/del/file/immagine''</font>") |
Button1.Foreground = Color.Red | Button1.Foreground = Color.Red | ||
Button1.Text = "Gambas" | Button1.Text = "Gambas" | ||
− | + | End | |
+ | |||
− | + | Public Sub Button1_Click() | |
Dim dsp As Pointer | Dim dsp As Pointer | ||
Riga 199: | Riga 269: | ||
Dim st As Stream | Dim st As Stream | ||
Dim i As Integer | Dim i As Integer | ||
− | + | ||
− | |||
− | |||
− | |||
dsp = XOpenDisplay(0) | dsp = XOpenDisplay(0) | ||
If dsp = 0 Then Error.Raise("Impossibile aprire una connessione al server X !") | If dsp = 0 Then Error.Raise("Impossibile aprire una connessione al server X !") | ||
− | + | ||
<FONT Color=gray>' ''Otteniamo un puntatore alla "Struttura" contenente i dati dell'immagine disegnata nel "Form":''</font> | <FONT Color=gray>' ''Otteniamo un puntatore alla "Struttura" contenente i dati dell'immagine disegnata nel "Form":''</font> | ||
xi = XGetImage(dsp, Me.Handle, 0, 0, Me.W, Me.H, XAllPlanes(), ZPixmap) | xi = XGetImage(dsp, Me.Handle, 0, 0, Me.W, Me.H, XAllPlanes(), ZPixmap) | ||
If IsNull(Image) Then Error.Raise("Impossibile ottenere un 'Puntatore' ai dati dell'immagine del Form !") | If IsNull(Image) Then Error.Raise("Impossibile ottenere un 'Puntatore' ai dati dell'immagine del Form !") | ||
− | + | ||
<FONT Color=gray>' ''Creiamo un semplice oggetto di tipo "Image":''</font> | <FONT Color=gray>' ''Creiamo un semplice oggetto di tipo "Image":''</font> | ||
im = New Image(Me.W, Me.H) | im = New Image(Me.W, Me.H) | ||
If IsNull(im) Then Error.Raise("Impossibile creare un oggetto 'Image' !") | If IsNull(im) Then Error.Raise("Impossibile creare un oggetto 'Image' !") | ||
− | + | ||
<FONT Color=gray>' ''Utilizziamo ovviamente i "Memory Stream" per scrivere nell'area di memoria dell'oggetto "Image", destinata ai dati attinenti ai pixel, il cui indirizzo di memoria è ritornato dalla Proprietà ".Data" della variabile di tipo "Image":''</font> | <FONT Color=gray>' ''Utilizziamo ovviamente i "Memory Stream" per scrivere nell'area di memoria dell'oggetto "Image", destinata ai dati attinenti ai pixel, il cui indirizzo di memoria è ritornato dalla Proprietà ".Data" della variabile di tipo "Image":''</font> | ||
st = Memory im.Data For Write | st = Memory im.Data For Write | ||
− | + | ||
For i = 0 To im.W * im.H * Len(im.Format) | For i = 0 To im.W * im.H * Len(im.Format) | ||
Write #st, Byte@(xi.data + i) As Byte | Write #st, Byte@(xi.data + i) As Byte | ||
Riga 223: | Riga 290: | ||
st.Close | st.Close | ||
− | <FONT Color=gray>' ''Genera in fine il file immagine:''</font> | + | <FONT Color=gray>' ''Genera in fine il file immagine.'' |
− | im.Save("<FONT Color= | + | ' ''Al nome del file immagine da creare va indicata l'estensione del formato immagine desiderato:''</font> |
+ | im.Save("<FONT Color=darkgreen>''/tmp/test.'''XXX'''''</font>", 100) | ||
<FONT Color=gray>' ''Va in chiusura:''</font> | <FONT Color=gray>' ''Va in chiusura:''</font> | ||
XCloseDisplay(dsp) | XCloseDisplay(dsp) | ||
− | + | End | |
oppure anche così: | oppure anche così: | ||
Library "libX11:6.4.0" | Library "libX11:6.4.0" | ||
Riga 281: | Riga 349: | ||
− | + | Public Sub Form_Open() | |
TextBox1.Text = "Gambas" | TextBox1.Text = "Gambas" | ||
− | PictureBox1.Picture = Picture.Load("<FONT Color= | + | PictureBox1.Picture = Picture.Load("<FONT Color=darkgreen>''/percorso/del/file/immagine''</font>") |
Button1.Foreground = Color.Red | Button1.Foreground = Color.Red | ||
Button1.Text = "Gambas" | Button1.Text = "Gambas" | ||
− | + | End | |
+ | |||
+ | |||
+ | Public Sub Button1_Click() | ||
− | |||
− | |||
Dim dsp, p As Pointer | Dim dsp, p As Pointer | ||
Dim xi As XImage | Dim xi As XImage | ||
Riga 298: | Riga 367: | ||
Dim st As Stream | Dim st As Stream | ||
Dim im As Image | Dim im As Image | ||
− | + | ||
− | |||
− | |||
− | |||
dsp = XOpenDisplay(0) | dsp = XOpenDisplay(0) | ||
If dsp == 0 Then Error.Raise("Impossibile aprire una connessione al server X !") | If dsp == 0 Then Error.Raise("Impossibile aprire una connessione al server X !") | ||
− | + | ||
<FONT Color=gray>' ''Otteniamo un puntatore alla "Struttura" contenente i dati dell'immagine disegnata nel "Form":''</font> | <FONT Color=gray>' ''Otteniamo un puntatore alla "Struttura" contenente i dati dell'immagine disegnata nel "Form":''</font> | ||
xi = XGetImage(dsp, Me.Handle, 0, 0, Me.W, Me.H, XAllPlanes(), ZPixmap) | xi = XGetImage(dsp, Me.Handle, 0, 0, Me.W, Me.H, XAllPlanes(), ZPixmap) | ||
If IsNull(Image) Then Error.Raise("Impossibile ottenere un 'Puntatore' ai dati dell'immagine del Form !") | If IsNull(Image) Then Error.Raise("Impossibile ottenere un 'Puntatore' ai dati dell'immagine del Form !") | ||
− | + | ||
bb = New Byte[] | bb = New Byte[] | ||
Riga 326: | Riga 392: | ||
st.Close | st.Close | ||
− | <FONT Color=gray>' ''Genera in fine il file immagine:''</font> | + | <FONT Color=gray>' ''Genera in fine il file immagine.'' |
− | im.Save("<FONT Color= | + | ' ''Al nome del file immagine da creare va indicata l'estensione del formato immagine desiderato:''</font> |
+ | im.Save("<FONT Color=darkgreen>''/tmp/test.'''XXX'''''</font>", 100) | ||
<FONT Color=gray>' ''Va in chiusura:''</font> | <FONT Color=gray>' ''Va in chiusura:''</font> | ||
XCloseDisplay(dsp) | XCloseDisplay(dsp) | ||
− | + | End | |
Riga 338: | Riga 405: | ||
L'uso delle risorse delle librerie esterne ''X11'' e ''ImLib2'' richiede nel codice Gambas la dichiarazione delle seguenti librerie dinamiche condivise: | L'uso delle risorse delle librerie esterne ''X11'' e ''ImLib2'' richiede nel codice Gambas la dichiarazione delle seguenti librerie dinamiche condivise: | ||
* "''libX11.so.6.4.0'' " | * "''libX11.so.6.4.0'' " | ||
− | * "''libImlib2.so.1. | + | * "''libImlib2.so.1.12.3'' " |
Mostriamo di seguito un semplice esempio analogo a quelli precedentemente visti: | Mostriamo di seguito un semplice esempio analogo a quelli precedentemente visti: | ||
− | Library "libX11:6.4.0" | + | Library "<FONT Color=blue>libX11:6.4.0</font>" |
Public Struct funcs | Public Struct funcs | ||
Riga 391: | Riga 458: | ||
− | Library "libImlib2:1. | + | Library "<FONT Color=red>libImlib2:1.12.3</font>" |
<FONT Color=gray>' ''Imlib_Image imlib_create_image_using_data(int width, int height, DATA32 * data)'' | <FONT Color=gray>' ''Imlib_Image imlib_create_image_using_data(int width, int height, DATA32 * data)'' | ||
Riga 410: | Riga 477: | ||
− | + | Public Sub Form_Open() | |
TextBox1.Text = "Gambas" | TextBox1.Text = "Gambas" | ||
− | PictureBox1.Picture = Picture.Load("<FONT Color= | + | PictureBox1.Picture = Picture.Load("<FONT Color=darkgreen>''/percorso/del/file/immagine''</font>") |
Button1.Foreground = Color.Red | Button1.Foreground = Color.Red | ||
Button1.Text = "Gambas" | Button1.Text = "Gambas" | ||
− | + | End | |
− | + | ||
+ | Public Sub Button1_Click() | ||
Dim dsp, immago As Pointer | Dim dsp, immago As Pointer | ||
Dim xi As XImage | Dim xi As XImage | ||
− | + | ||
− | |||
− | |||
− | |||
dsp = XOpenDisplay(0) | dsp = XOpenDisplay(0) | ||
If dsp == 0 Then Error.Raise("Impossibile aprire una connessione al server X !") | If dsp == 0 Then Error.Raise("Impossibile aprire una connessione al server X !") | ||
− | + | ||
<FONT Color=gray>' ''Otteniamo un puntatore alla "Struttura" contenente i dati dell'immagine disegnata nel "Form":''</font> | <FONT Color=gray>' ''Otteniamo un puntatore alla "Struttura" contenente i dati dell'immagine disegnata nel "Form":''</font> | ||
xi = XGetImage(dsp, Me.Handle, 0, 0, Me.W, Me.H, XAllPlanes(), ZPixmap) | xi = XGetImage(dsp, Me.Handle, 0, 0, Me.W, Me.H, XAllPlanes(), ZPixmap) | ||
If IsNull(Image) Then Error.Raise("Impossibile ottenere un 'Puntatore' ai dati dell'immagine del Form !") | If IsNull(Image) Then Error.Raise("Impossibile ottenere un 'Puntatore' ai dati dell'immagine del Form !") | ||
− | + | ||
<FONT Color=gray>' ''Viene creata l'immagine dai dati grezzi passando il "Puntatore" ai dati grezzi dell'immagine:''</font> | <FONT Color=gray>' ''Viene creata l'immagine dai dati grezzi passando il "Puntatore" ai dati grezzi dell'immagine:''</font> | ||
immago = imlib_create_image_using_data(Me.W, Me.H, xi.data) | immago = imlib_create_image_using_data(Me.W, Me.H, xi.data) | ||
If immago == 0 Then Error.Raise("Impossibile creare l'immagine dai dati grezzi acquisiti !") | If immago == 0 Then Error.Raise("Impossibile creare l'immagine dai dati grezzi acquisiti !") | ||
− | + | ||
imlib_context_set_image(immago) | imlib_context_set_image(immago) | ||
− | + | ||
− | <FONT Color=gray>' ''L'immagine creata viene salvata in un file immagine. Al nome del file immagine da creare va indicata l'estensione del formato immagine desiderato:''</font> | + | <FONT Color=gray>' ''L'immagine creata viene salvata in un file immagine.'' |
− | imlib_save_image("<FONT Color= | + | ' '''''Al nome del file immagine da creare va indicata l'estensione del formato immagine desiderato:'''''</font> |
− | + | imlib_save_image("<FONT Color=darkgreen>''/tmp/test.'''XXX'''''</font>") | |
+ | |||
<FONT Color=gray>' ''Va in chiusura:''</font> | <FONT Color=gray>' ''Va in chiusura:''</font> | ||
imlib_free_image() | imlib_free_image() | ||
XCloseDisplay(dsp) | XCloseDisplay(dsp) | ||
− | + | End | |
+ | |||
+ | |||
+ | |||
+ | =Note= | ||
+ | [1] Vedere anche la seguente pagina: [[Creare un file immagine dagli oggetti presenti in un Contenitore]] |
Versione attuale delle 17:14, 18 ott 2024
Per ottenere un'immagine del Form, comprensivo di ogni Oggetto grafico figlio in esso contenuto, è possibile adottare alcune modalità. [nota 1]
Indice
Usando la Classe Paint
Nel seguente esempio pratico si hanno sul Form (Contenitore) due Label e un Button. Si intende ottenere un file immagine di quanto appare nel Form.
Private lb1 As Label Private lb2 As Label Private Button1 As Button Public Sub _new() With Me .Center .W = 700 .H = 600 .Background = Color.Background End With With lb1 = New Label(Me) .X = 100 .Y = 100 .W = 100 .H = 50 .Background = Color.Red .Foreground = Color.Yellow .Alignment = Align.Center .Text = "Label rossa" End With With lb2 = New Label(Me) .X = 200 .Y = 200 .W = 100 .H = 50 .Background = Color.Yellow .Foreground = Color.Red .Alignment = Align.Right .Text = "Label gialla" End With With Button1 = New Button(Me) As "Button1" .W = 60 .H = 60 .X = Me.W - (Button1.W * 2) .Y = Me.H - (Button1.H * 2) End With End Public Sub Button1_Click() Dim ob As Object Dim im As Image ' Si crea la superficie dell'immagine che dovrà contenere la riproduzione grafica di quanto presente sul Form: im = New Image(Me.W, Me.H, Me.Background, Image.Standard) With Paint .Begin(im) For Each ob In Me.Children ' Il colore, con il quale saranno stampati i due oggetti "Label", lo ricaviamo dal colore di sfondo di ciascun Oggetto: .Brush = .Color(ob.Background) ' Sarà stampato il contenuto presente nel rettangolo di coordinate e dimensioni uguali a quelle dell'oggetto da stampare: .Rectangle(ob.X, ob.Y, ob.W, ob.H) .Fill ' Ora viene impostato il colore del testo: .Brush = .Color(ob.Foreground) ' Viene impostato il testo con le caratteristiche originarie degli Oggetti: .Text(ob.Text, ob.X, ob.Y, ob.W, ob.H) .Fill Next .End End With im.Save("/tmp/immagine.png", 100) End
Uso del Metodo ".Screenshot()" della Classe Desktop
La prima modalità prevede l'uso del Metodo ".Screenshot()" della Classe Desktop. Pertanto è necessario attivare anche i Componenti gb.desktop e gb.desktop.x11 di Gambas.
Con il Metodo ".Screenshot()" si otterrà una Picture dell'Oggetto grafico (il Form in tal caso) posto a una distanza x, y dall'angolo alto sinistro dello schermo.
Nell'esempio pratico che segue, porremo sul Form un TextBox, una PictureBox, per far mostrare un qualsiasi file immagine, e un Button. Si provvederà a effettuare la schermata del Form, pochissimo tempo dopo che questo si sarà attivato.
Public Sub Form_Open() TextBox1.Text = "Gambas" PictureBox1.Picture = Picture.Load("/percorso/del/file/immagine") Button1.Foreground = Color.Red Button1.Text = "Gambas" End Public Sub Button1_Click() Dim pc As Picture ' Effettua la schermata del Form, generando un Oggetto di tipo "Picture": pc = Desktop.Screenshot(Me.ScreenX, Me.ScreenY, Me.W, Me.H) ' Salva la schermata in un file immagine di tipo "png": pc.Save("/tmp/test.png", 100) Print "Immagine acquisita !" End
Uso del Metodo ".GetScreenshot()" della Classe DesktopWindow
La seconda malità prevede l'uso del Metodo ".GetScreenshot()" della Classe DesktopWindow. Pertanto è necessario attivare anche i Componenti gb.desktop e gb.desktop.x11 di Gambas.
Con il Metodo ".GetScreenshot()" si otterrà una Picture dell'Oggetto grafico (il Form in tal caso) posto a una distanza x, y dall'angolo alto sinistro dello schermo.
Nell'esempio pratico che segue, porremo sul Form un TextBox, una PictureBox, per far mostrare un qualsiasi file immagine, e un Button. Anche in questo caso si provvederà a effettuare la schermata del Form, pochissimo tempo dopo che questo si sarà attivato.
Public Sub Form_Open() TextBox1.Text = "Gambas" PictureBox1.Picture = Picture.Load("/percorso/del/file/immagine") Button1.Foreground = Color.Red Button1.Text = "Gambas" End Public Sub Button1_Click() Dim dw As DesktopWindow Dim pc As Picture ' Genera una variabile di tipo "DesktopWindow" che punta al Form, avendo individuato il numero identificativo della finestra del Form medesimo: With dw = New DesktopWindow(Me.Id) ' Effettua la schermata del Form, generando un Oggetto di tipo "Picture": pc = .GetScreenshot(True) End With ' Salva la schermata in un file immagine di tipo "png": pc.Save("/tmp/test.png", 100) Print "Immagine acquisita" End
Uso delle risorse del Componente gb.media
Per catturare l'immagine del Form, si potranno usare anche le risorse del Componente gb.media.
Mostriamo un esempio pratico:
Public Sub Form_Open() Dim r, c As Byte With GridView1 .Rows.Count = 5 .Columns.Count = 5 End With For r = 0 To 4 For c = 0 To 4 GridView1[r, c].Text = "abcde" Next Next End Public Sub Button1_Click() Dim pl As MediaPipeline Dim src, vdc, enc, snk As MediaControl pl = New MediaPipeline src = New MediaControl(pl, "ximagesrc") src["xid"] = Me.Id vdc = New MediaControl(pl, "videoconvert") enc = New MediaControl(pl, "pngenc") snk = New MediaControl(pl, "filesink") snk["location"] = "/tmp/immagine.png" src.LinkTo(vdc) vdc.LinkTo(enc) enc.LinkTo(snk) pl.Play() Repeat Wait 0.01 Until Right(File.Load("/tmp/immagine.png"), SizeOf(gb.Integer)) = MkInt(&826042AE) pl.Stop() pl.Close() Print "Cattura immagine effettuata" End
Uso delle funzioni esterne del API di X11
Questa modalità prevede l'uso di alcune funzioni esterne appartenenti al API del sistema grafico X11. E' pertanto richiesta la dichiarazione in Gambas della libreria condivisa: "libX11.so.6.4.0 ".
L'assegnazione dei dati dei pixel del Form, contenuti nell'area di memoria puntata dal Puntatore restituito dalla funzione esterna XGetImage( ) della libreria di X11, direttamente all'area di memoria puntata dalla Proprietà ".Data" di un Oggetto Image preliminarmente creato.
Nell'esempio pratico che segue, porremo sul Form un TextBox, una PictureBox, per far mostrare un qualsiasi file immagine, e un Button. Anche in questo caso si provvederà a effettuare la schermata del Form, pochissimo tempo dopo che questo si sarà attivato.
Library "libX11:6.4.0" Public Struct funcs create_image As Pointer destroy_image As Pointer get_pixel As Pointer put_pixel As Pointer sub_image As Pointer add_pixel As Pointer End Struct Public Struct XImage width As Integer height As Integer xoffset As Integer gformat As Integer data As Pointer byte_order As Integer bitmap_unit As Integer bitmap_bit_order As Integer bitmap_pad As Integer depth As Integer bytes_per_line As Integer bits_per_pixel As Integer red_mask As Long green_mask As Long blue_mask As Long obdata As Pointer func As Struct Funcs End Struct Private Enum XYBitmap = 0, XYPixmap, ZPixmap ' Display *XOpenDisplay(char *display_name) ' Opens a connection to the X server that controls a display. Private Extern XOpenDisplay(display_name As Pointer) As Pointer ' unsigned long XAllPlanes() ' Returns a value with all bits set to 1 suitable for use in a plane argument to a procedure. Private Extern XAllPlanes() As Long ' XImage *XGetImage(Display *display, Drawable d, int x, int y, unsigned int width, unsigned int height, unsigned long plane_mask, int format) ' Returns a pointer to an XImage structure. Private Extern XGetImage(display As Pointer, d As Long, x As Integer, y As Integer, width As Integer, height As Integer, plane_mask As Long, xformat As Integer) As XImage ' XCloseDisplay(Display *display) ' Closes the connection to the X server for the display specified in the Display structure and destroys all windows. Private Extern XCloseDisplay(display As Pointer) Public Sub Form_Open() TextBox1.Text = "Gambas" PictureBox1.Picture = Picture.Load("/percorso/del/file/immagine") Button1.Foreground = Color.Red Button1.Text = "Gambas" End Public Sub Button1_Click() Dim dsp As Pointer Dim xi As XImage Dim im As Image Dim st As Stream Dim i As Integer dsp = XOpenDisplay(0) If dsp = 0 Then Error.Raise("Impossibile aprire una connessione al server X !") ' Otteniamo un puntatore alla "Struttura" contenente i dati dell'immagine disegnata nel "Form": xi = XGetImage(dsp, Me.Handle, 0, 0, Me.W, Me.H, XAllPlanes(), ZPixmap) If IsNull(Image) Then Error.Raise("Impossibile ottenere un 'Puntatore' ai dati dell'immagine del Form !") ' Creiamo un semplice oggetto di tipo "Image": im = New Image(Me.W, Me.H) If IsNull(im) Then Error.Raise("Impossibile creare un oggetto 'Image' !") ' Utilizziamo ovviamente i "Memory Stream" per scrivere nell'area di memoria dell'oggetto "Image", destinata ai dati attinenti ai pixel, il cui indirizzo di memoria è ritornato dalla Proprietà ".Data" della variabile di tipo "Image": st = Memory im.Data For Write For i = 0 To im.W * im.H * Len(im.Format) Write #st, Byte@(xi.data + i) As Byte Next st.Close ' Genera in fine il file immagine. ' Al nome del file immagine da creare va indicata l'estensione del formato immagine desiderato: im.Save("/tmp/test.XXX", 100) ' Va in chiusura: XCloseDisplay(dsp) End
oppure anche così:
Library "libX11:6.4.0" Public Struct funcs create_image As Pointer destroy_image As Pointer get_pixel As Pointer put_pixel As Pointer sub_image As Pointer add_pixel As Pointer End Struct Public Struct XImage width As Integer height As Integer xoffset As Integer gformat As Integer data As Pointer byte_order As Integer bitmap_unit As Integer bitmap_bit_order As Integer bitmap_pad As Integer depth As Integer bytes_per_line As Integer bits_per_pixel As Integer red_mask As Long green_mask As Long blue_mask As Long obdata As Pointer func As Struct Funcs End Struct Private Enum XYBitmap = 0, XYPixmap, ZPixmap ' Display *XOpenDisplay(char *display_name) ' Opens a connection to the X server that controls a display. Private Extern XOpenDisplay(display_name As Pointer) As Pointer ' unsigned long XAllPlanes() ' Returns a value with all bits set to 1 suitable for use in a plane argument to a procedure. Private Extern XAllPlanes() As Long ' XImage *XGetImage(Display *display, Drawable d, int x, int y, unsigned int width, unsigned int height, unsigned long plane_mask, int format) ' Returns a pointer to an XImage structure. Private Extern XGetImage(display As Pointer, d As Long, x As Integer, y As Integer, width As Integer, height As Integer, plane_mask As Long, xformat As Integer) As XImage ' XCloseDisplay(Display *display) ' Closes the connection to the X server for the display specified in the Display structure and destroys all windows. Private Extern XCloseDisplay(display As Pointer) Public Sub Form_Open() TextBox1.Text = "Gambas" PictureBox1.Picture = Picture.Load("/percorso/del/file/immagine") Button1.Foreground = Color.Red Button1.Text = "Gambas" End Public Sub Button1_Click() Dim dsp, p As Pointer Dim xi As XImage Dim bb As Byte[] Dim i As Integer Dim st As Stream Dim im As Image dsp = XOpenDisplay(0) If dsp == 0 Then Error.Raise("Impossibile aprire una connessione al server X !") ' Otteniamo un puntatore alla "Struttura" contenente i dati dell'immagine disegnata nel "Form": xi = XGetImage(dsp, Me.Handle, 0, 0, Me.W, Me.H, XAllPlanes(), ZPixmap) If IsNull(Image) Then Error.Raise("Impossibile ottenere un 'Puntatore' ai dati dell'immagine del Form !") bb = New Byte[] For i = 0 To (Me.W * Me.H * 4) - 1 bb.Push(Byte@(xi.data + i)) Next ' Creiamo un semplice oggetto di tipo "Image": im = New Image(Me.W, Me.H) If IsNull(im) Then Error.Raise("Impossibile creare un oggetto 'Image' !") p = Pointer@(Object.Address(im) + (SizeOf(gb.Pointer) * 2)) ' Scriviamo i dati immagine grezzi, ottenuti dalla funzione XGetImage(), nell'area di memoria puntata dal membro "*data" della Struttura "GB_IMG" contenuta nel file sorgente ".../main/lib/image/gb.image.h": st = Memory p For Write bb.Write(st, 0, bb.Count) st.Close ' Genera in fine il file immagine. ' Al nome del file immagine da creare va indicata l'estensione del formato immagine desiderato: im.Save("/tmp/test.XXX", 100) ' Va in chiusura: XCloseDisplay(dsp) End
Uso delle funzioni esterne del API di X11 e di ImLib2
L'uso delle risorse delle librerie esterne X11 e ImLib2 richiede nel codice Gambas la dichiarazione delle seguenti librerie dinamiche condivise:
- "libX11.so.6.4.0 "
- "libImlib2.so.1.12.3 "
Mostriamo di seguito un semplice esempio analogo a quelli precedentemente visti:
Library "libX11:6.4.0" Public Struct funcs create_image As Pointer destroy_image As Pointer get_pixel As Pointer put_pixel As Pointer sub_image As Pointer add_pixel As Pointer End Struct Public Struct XImage width As Integer height As Integer xoffset As Integer gformat As Integer data As Pointer byte_order As Integer bitmap_unit As Integer bitmap_bit_order As Integer bitmap_pad As Integer depth As Integer bytes_per_line As Integer bits_per_pixel As Integer red_mask As Long green_mask As Long blue_mask As Long obdata As Pointer func As Struct Funcs End Struct Private Enum XYBitmap = 0, XYPixmap, ZPixmap ' Display *XOpenDisplay(char *display_name) ' Opens a connection to the X server that controls a display. Private Extern XOpenDisplay(display_name As Pointer) As Pointer ' unsigned long XAllPlanes() ' Returns a value with all bits set to 1 suitable for use in a plane argument to a procedure. Private Extern XAllPlanes() As Long ' XImage *XGetImage(Display *display, Drawable d, int x, int y, unsigned int width, unsigned int height, unsigned long plane_mask, int format) ' Returns a pointer to an XImage structure. Private Extern XGetImage(display As Pointer, d As Long, x As Integer, y As Integer, width As Integer, height As Integer, plane_mask As Long, xformat As Integer) As XImage ' XCloseDisplay(Display *display) ' Closes the connection to the X server for the display specified in the Display structure and destroys all windows. Private Extern XCloseDisplay(display As Pointer) Library "libImlib2:1.12.3" ' Imlib_Image imlib_create_image_using_data(int width, int height, DATA32 * data) ' Creates an image from the image data - in the format of a DATA32 (32 bits) per pixel in a linear array - specified with the width and the height specified. Private Extern imlib_create_image_using_data(width As Integer, height As Integer, data As Pointer) As Pointer ' void imlib_context_set_image(Imlib_Image image) ' Sets the current image Imlib2 will be using with its function calls. Private Extern imlib_context_set_image(Iimage As Pointer) ' void imlib_save_image(const char *filename) ' Saves the current image in the format specified by the current image's format settings to the filename. Private Extern imlib_save_image(filename As String) ' void imlib_free_image(void) ' Frees the image that is set as the current image in Imlib2's context. Private Extern imlib_free_image() Public Sub Form_Open() TextBox1.Text = "Gambas" PictureBox1.Picture = Picture.Load("/percorso/del/file/immagine") Button1.Foreground = Color.Red Button1.Text = "Gambas" End Public Sub Button1_Click() Dim dsp, immago As Pointer Dim xi As XImage dsp = XOpenDisplay(0) If dsp == 0 Then Error.Raise("Impossibile aprire una connessione al server X !") ' Otteniamo un puntatore alla "Struttura" contenente i dati dell'immagine disegnata nel "Form": xi = XGetImage(dsp, Me.Handle, 0, 0, Me.W, Me.H, XAllPlanes(), ZPixmap) If IsNull(Image) Then Error.Raise("Impossibile ottenere un 'Puntatore' ai dati dell'immagine del Form !") ' Viene creata l'immagine dai dati grezzi passando il "Puntatore" ai dati grezzi dell'immagine: immago = imlib_create_image_using_data(Me.W, Me.H, xi.data) If immago == 0 Then Error.Raise("Impossibile creare l'immagine dai dati grezzi acquisiti !") imlib_context_set_image(immago) ' L'immagine creata viene salvata in un file immagine. ' Al nome del file immagine da creare va indicata l'estensione del formato immagine desiderato: imlib_save_image("/tmp/test.XXX") ' Va in chiusura: imlib_free_image() XCloseDisplay(dsp) End
Note
[1] Vedere anche la seguente pagina: Creare un file immagine dagli oggetti presenti in un Contenitore