Sto cercando di catturare un'immagine dello schermo per l'uso in screencasting. Quindi ho bisogno di una soluzione veloce e non posso fare affidamento su programmi di shell come import o xwd.Come si fa a prendere uno screenshot correttamente con xlib?
Questo è il codice che ho scritto finora, ma non riesce e mi dà un'immagine spazzatura, che sembra mostrare frammenti di diverse immagini con colori dispari messi insieme.
http://s9.postimage.org/dqnkgkwr1/blah.png
Tutte le idee su quello che sto facendo male?
#include <X11/Xlib.h>
#include <X11/X.h>
#include <cstdio>
#include <CImg.h>
using namespace cimg_library;
int main()
{
Display *display = XOpenDisplay(NULL);
Window root = DefaultRootWindow(display);
XWindowAttributes gwa;
XGetWindowAttributes(display, root, &gwa);
int width = gwa.width;
int height = gwa.height;
XImage *image = XGetImage(display,root, 0,0 , width,height,AllPlanes, ZPixmap);
unsigned char *array = new unsigned char[width * height * 3];
unsigned long red_mask = image->red_mask;
unsigned long green_mask = image->green_mask;
unsigned long blue_mask = image->blue_mask;
for (int x = 0; x < width; x++)
for (int y = 0; y < height ; y++)
{
unsigned long pixel = XGetPixel(image,x,y);
unsigned char blue = pixel & blue_mask;
unsigned char green = (pixel & green_mask) >> 8;
unsigned char red = (pixel & red_mask) >> 16;
array[(x + width * y) * 3] = red;
array[(x + width * y) * 3+1] = green;
array[(x + width * y) * 3+2] = blue;
}
CImg<unsigned char> pic(array,width,height,1,3);
pic.save_png("blah.png");
printf("%ld %ld %ld\n",red_mask>> 16, green_mask>>8, blue_mask);
return 0;
}
Ciao @lalaland puoi condividere il tuo codice finale, questo supporta il multi monitor? – Noitidart
@Noitidart Sì, ho supportato più monitor. Penso che https://github.com/Lalaland/ScreenCap/blob/master/src/screenCapturerImpl.cpp potrebbe essere il file giusto. Non ho toccato il codice negli anni però. Il codice è scritto male, ma se vuoi usarlo, lancerò una licenza BSD. – Lalaland
Grazie mille @lalaland per la risposta così veloce! Se hai tempo è ok se ho postato sulla tua pagina dei problemi in modo che io possa capire come funziona con i multi monitor – Noitidart