Ottenere l'immagine della finestra di un programma: differenze tra le versioni

Da Gambas-it.org - Wikipedia.
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>&#091;[[#Note|'''nota 1''']]&#093;</sup> <SUP>&#091;[[#Note|nota 2]]&#093;</sup>
  ' ''Nel 2°, nel 5° e nel 6° argomento dovremo inserire il numero identificativo della finestra del programma e le sue dimensioni.'' <SUP>&#091;[[#Note|'''nota 1''']]&#093;</sup> <SUP>&#091;[[#Note|'''nota 2''']]&#093;</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:

[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