Ottenere l'immagine della finestra di un programma: differenze tra le versioni
Vai alla navigazione
Vai alla ricerca
Nessun oggetto della modifica |
Nessun oggetto della modifica |
||
| (2 versioni intermedie di uno stesso utente non sono mostrate) | |||
| Riga 1: | Riga 1: | ||
==Uso delle risorse del Componente ''gb.media''== | ==Uso delle risorse del Componente ''gb.media''== | ||
Per ottenere con il seguente codice l'immagine della finestra di un programma, presente sulla ''Scrivania'', si dovrà attivare il Componente ''gb.media'' . | Per ottenere con il seguente codice l'immagine della finestra di un programma (Gambas o esterno), presente sulla ''Scrivania'', si dovrà attivare il Componente ''gb.media'' . | ||
Public Sub Button1_Click() | Public Sub Button1_Click() | ||
| Riga 94: | Riga 94: | ||
<FONT Color=gray>' ''Otteniamo un puntatore alla "Struttura" contenente i dati della finestra del programma.'' | <FONT Color=gray>' ''Otteniamo un puntatore alla "Struttura" contenente i dati della finestra del programma.'' | ||
' ''Nel 2°, nel 5° e nel 6° argomento dovremo inserire il numero identificativo della finestra del programma e le sue dimensioni.'' <SUP>[[[#Note|'''nota 1''']]]</sup> <SUP>[[[#Note|nota 2]]]</sup> | ' ''Nel 2°, nel 5° e nel 6° argomento dovremo inserire il numero identificativo della finestra del programma e le sue dimensioni.'' <SUP>[[[#Note|'''nota 1''']]]</sup> <SUP>[[[#Note|'''nota 2''']]]</sup> | ||
' ''I valori immessi delle dimensioni <U>non</u> dovranno essere superiori a quelli effettivi, pena il crash del programma.''</font> | ' ''I valori immessi delle dimensioni <U>non</u> dovranno essere superiori a quelli effettivi, pena il crash del programma.''</font> | ||
xi = XGetImage(dsp, <FONT Color=red><I>ID_finestra</i></font>, 0, 0, <FONT Color=red><I>larghezza_finestra</i></font>, <FONT Color=red><I>altezza_finestra</i></font>, XAllPlanes(), ZPixmap) | xi = XGetImage(dsp, <FONT Color=red><I>ID_finestra</i></font>, 0, 0, <FONT Color=red><I>larghezza_finestra</i></font>, <FONT Color=red><I>altezza_finestra</i></font>, XAllPlanes(), ZPixmap) | ||
| Riga 129: | Riga 129: | ||
* [[Individuare il nome della finestra di un programma]] | * [[Individuare il nome della finestra di un programma]] | ||
[2] Per ottenere le dimensioni (larghezza e altezza) della finestra di un programma, è possibile usare il seguente codice attivando anche i Componenti ''gb.desktop'' e gb.desktop.x11'': | [2] Per ottenere le dimensioni (larghezza e altezza) della finestra di un programma, è possibile usare il seguente codice attivando anche i Componenti ''gb.desktop'' e ''gb.desktop.x11'': | ||
Public Sub Button1_Click() | Public Sub Button1_Click() | ||
Versione attuale delle 16:28, 10 set 2025
Uso delle risorse del Componente gb.media
Per ottenere con il seguente codice l'immagine della finestra di un programma (Gambas o esterno), presente sulla Scrivania, si dovrà attivare il Componente gb.media .
Public Sub Button1_Click() Dim pl As MediaPipeline Dim src, vdc, enc, snk As MediaControl pl = New MediaPipeline src = New MediaControl(pl, "ximagesrc") ' Assegna l'ID della finestra del programma: ' [nota 1] src["xid"] = ...... 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() pl.Stop() pl.Close() Print "Cattura immagine effettuata" End
Uso delle funzioni esterne di libX11
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 ".
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 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 della finestra del programma.
' Nel 2°, nel 5° e nel 6° argomento dovremo inserire il numero identificativo della finestra del programma e le sue dimensioni. [nota 1] [nota 2]
' I valori immessi delle dimensioni non dovranno essere superiori a quelli effettivi, pena il crash del programma.
xi = XGetImage(dsp, ID_finestra, 0, 0, larghezza_finestra, altezza_finestra, 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" avente le medesime dimensioni della finestra del programma:
im = New Image(larghezza_finestra, altezza_finestra)
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 * (im.Depth / 8)
Write #st, Byte@(xi.data + i) As Byte
Next
st.Close
' Genera in fine il file immagine:
im.Save("/percorso/del/file/immagine", 100)
' Va in chiusura:
XCloseDisplay(dsp)
End
Note
[1] Per ottenere il numero identificativo della finestra di un programma, vedere le seguenti pagine:
- Individuare ed estrarre l'ID della finestra di un programma
- Individuare ID e nome delle finestre attive, nonché il PID dei loro programmi con le risorse del Componente gb.desktop.x11
- Individuare ID e nome delle finestre attive con le risorse del Componente gb.desktop
- Individuare il nome della finestra di un programma
[2] Per ottenere le dimensioni (larghezza e altezza) della finestra di un programma, è possibile usare il seguente codice attivando anche i Componenti gb.desktop e gb.desktop.x11:
Public Sub Button1_Click() Dim ii As Integer ii = X11.GetWindowGeometry(ID_finestra_del_programma) ' I valori delle dimensioni della finestra di un programma sono contenuti nel 3° e nel 4° elemento dell'array ritornato: Print "Larghezza: "; ii[2] Print "Altezza : "; ii[3] End