Estoy tratando de capturar una imagen de la pantalla para su uso en screencasting. Por lo tanto, necesito una solución rápida y no puedo confiar en los programas de shell como import o xwd.¿Cómo se toma una captura de pantalla correctamente con xlib?
Este es el código que he escrito hasta ahora, pero falla y me da una imagen basura, que solo parece mostrar fragmentos de varias imágenes con colores extraños mezclados.
http://s9.postimage.org/dqnkgkwr1/blah.png
Alguna idea sobre lo que estoy haciendo mal?
#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;
}
Hola @lalaland, ¿pueden compartir su código final? ¿Es compatible con este monitor? – Noitidart
@Noitidart Sí, admití varios monitores. Creo que https://github.com/Lalaland/ScreenCap/blob/master/src/screenCapturerImpl.cpp podría ser el archivo correcto. Sin embargo, no he tocado el código en años. El código está mal escrito, pero si quieres usarlo, lanzaré una licencia BSD allí. – Lalaland
Muchas gracias @lalaland por su respuesta tan rápido! Si tiene tiempo, ¿está bien si publiqué en su página de problemas para que pueda entender cómo funciona con múltiples monitores? – Noitidart