Differenze tra le versioni di "Ottenere una schermata (screenshot) del desktop con le risorse del API di X11 e di Imlib2"
Da Gambas-it.org - Wikipedia.
(6 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 3: | Riga 3: | ||
Per poter fruire di tali risorse, è necessario richiamare in Gambas le librerie dinamiche e condivise: | Per poter fruire di tali risorse, è necessario richiamare in Gambas le librerie dinamiche e condivise: | ||
− | * ''libX11.so.6. | + | * ''libX11.so.6.4.0'' |
− | * ''libImlib2.so.1. | + | * ''libImlib2.so.1.12.2'' |
Mostriamo un esempio, nel quale verrà effettuata una schermata dell'intero desktop. In fine la schermata verrà salvata in un file di formato .png: | Mostriamo un esempio, nel quale verrà effettuata una schermata dell'intero desktop. In fine la schermata verrà salvata in un file di formato .png: | ||
− | Library "libX11:6. | + | Library "<FONT Color=blue>libX11:6.4.0</font>" |
Private Enum XYBitmap = 0, XYPixmap, ZPixmap | Private Enum XYBitmap = 0, XYPixmap, ZPixmap | ||
Riga 14: | Riga 14: | ||
<FONT Color=gray>' ''Display *XOpenDisplay(char *display_name)'' | <FONT Color=gray>' ''Display *XOpenDisplay(char *display_name)'' | ||
' ''Opens a connection to the X server that controls a display.''</font> | ' ''Opens a connection to the X server that controls a display.''</font> | ||
− | Private Extern XOpenDisplay( | + | Private Extern XOpenDisplay(display_name As String) As Pointer |
<FONT Color=gray>' ''int XDefaultScreen(display)'' | <FONT Color=gray>' ''int XDefaultScreen(display)'' | ||
Riga 49: | Riga 49: | ||
− | Library "libImlib2:1. | + | Library "<FONT Color=red>libImlib2:1.12.2</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 64: | Riga 64: | ||
− | + | Public Sub Main() | |
− | Dim dsp, vis, XImage, | + | Dim dsp, vis, XImage, imago As Pointer |
Dim root As Long | Dim root As Long | ||
Dim scr, wi, he As Integer | Dim scr, wi, he As Integer | ||
<FONT Color=gray>' ''Si connette con il display:''</font> | <FONT Color=gray>' ''Si connette con il display:''</font> | ||
− | + | dsp = XOpenDisplay(0) | |
− | + | If dsp == 0 Then Error.Raise("Impossibile aprire una connessione al server X !") | |
− | + | scr = XDefaultScreen(dsp) | |
− | + | root = XDefaultRootWindow(dsp) | |
− | + | vis = XDefaultVisual(dsp, scr) | |
+ | If vis == 0 Then Error.Raise("Errore !") | ||
− | + | wi = XDisplayWidth(dsp, scr) | |
− | + | he = XDisplayHeight(dsp, scr) | |
<FONT Color=gray>' ''Otteniamo un puntatore alla "Struttura" contenente i dati-immagine del desktop:''</font> | <FONT Color=gray>' ''Otteniamo un puntatore alla "Struttura" contenente i dati-immagine del desktop:''</font> | ||
− | + | XImage = XGetImage(dsp, root, 0, 0, wi, he, XAllPlanes(), ZPixmap) | |
− | + | If XImage == 0 Then Error.Raise("Impossibile ottenere un 'Puntatore' ai dati-immagine del desktop !") | |
− | + | XImage = XImage + (SizeOf(gb.Pointer) * 2) | |
− | + | imago = imlib_create_image_using_data(wi, he, Pointer@(XImage)) | |
− | + | If imago == 0 Then Error.Raise("Impossibile creare l'immagine dai dati grezzi acquisiti !") | |
− | + | imlib_context_set_image(imago) | |
<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. Al nome del file immagine da creare va indicata l'estensione del formato immagine desiderato:''</font> | ||
− | + | imlib_save_image("<FONT Color=gray>''/tmp/immagine.png''</font>") | |
− | |||
<FONT Color=gray>' ''Va in chiusura:''</font> | <FONT Color=gray>' ''Va in chiusura:''</font> | ||
− | + | XCloseDisplay(dsp) | |
− | + | End | |
− | |||
Riga 108: | Riga 107: | ||
=Riferimenti= | =Riferimenti= | ||
* http://tronche.com/gui/x/xlib | * http://tronche.com/gui/x/xlib | ||
− | * | + | * https://docs.enlightenment.org/api/imlib2/html/ |
Versione attuale delle 16:12, 25 giu 2024
E' possibile ottenere una schermata del desktop utilizzando alcune risorse esterne del API di X11 e di Imlib2.
Per poter fruire di tali risorse, è necessario richiamare in Gambas le librerie dinamiche e condivise:
- libX11.so.6.4.0
- libImlib2.so.1.12.2
Mostriamo un esempio, nel quale verrà effettuata una schermata dell'intero desktop. In fine la schermata verrà salvata in un file di formato .png:
Library "libX11:6.4.0" 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 String) As Pointer ' int XDefaultScreen(display) ' Returns the default screen number. Private Extern XDefaultScreen(display As Pointer) As Integer ' Window XDefaultRootWindow(display) ' Returns the root window for the default screen. Private Extern XDefaultRootWindow(display As Pointer) As Long ' Visual *XDefaultVisual(display, screen_number) ' Returns the default visual type for the specified screen. Private Extern XDefaultVisual(display As Pointer, scr_num As Integer) As Pointer ' int XDisplayWidth(display, screen_number) ' Returns the width of the screen in pixels. Private Extern XDisplayWidth(display As Pointer, scr_num As Integer) As Integer ' int XDisplayHeight(display, screen_number) ' Returns an integer that describes the height of the screen in pixels. Private Extern XDisplayHeight(display As Pointer, scr_num As Integer) As Integer ' 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(displayP As Pointer, d As Long, xI As Integer, yI As Integer, wid As Integer, hei As Integer, plane_mask As Long, formatI As Integer) As Pointer ' 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.2" ' 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(Imlib_Image 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) Public Sub Main() Dim dsp, vis, XImage, imago As Pointer Dim root As Long Dim scr, wi, he As Integer ' Si connette con il display: dsp = XOpenDisplay(0) If dsp == 0 Then Error.Raise("Impossibile aprire una connessione al server X !") scr = XDefaultScreen(dsp) root = XDefaultRootWindow(dsp) vis = XDefaultVisual(dsp, scr) If vis == 0 Then Error.Raise("Errore !") wi = XDisplayWidth(dsp, scr) he = XDisplayHeight(dsp, scr) ' Otteniamo un puntatore alla "Struttura" contenente i dati-immagine del desktop: XImage = XGetImage(dsp, root, 0, 0, wi, he, XAllPlanes(), ZPixmap) If XImage == 0 Then Error.Raise("Impossibile ottenere un 'Puntatore' ai dati-immagine del desktop !") XImage = XImage + (SizeOf(gb.Pointer) * 2) imago = imlib_create_image_using_data(wi, he, Pointer@(XImage)) If imago == 0 Then Error.Raise("Impossibile creare l'immagine dai dati grezzi acquisiti !") imlib_context_set_image(imago) ' 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/immagine.png") ' Va in chiusura: XCloseDisplay(dsp) End