J'essaye de capturer une image de l'écran pour l'usage dans le screencasting. J'ai donc besoin d'une solution rapide, et je ne peux pas compter sur des programmes shell tels que import ou xwd.Comment faire une capture d'écran correctement avec xlib?
Ceci est le code que j'ai écrit jusqu'à présent, mais il échoue et me donne une image indésirable, qui semble juste montrer des fragments de plusieurs images avec des couleurs impaires lues ensemble.
http://s9.postimage.org/dqnkgkwr1/blah.png
Toutes les idées sur ce que je fais 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;
}
Salut @alaland pouvez-vous s'il vous plaît partager votre code final, est-ce compatible multi moniteur? – Noitidart
@Noitidart Oui, j'ai supporté plusieurs moniteurs. Je pense que https://github.com/Lalaland/ScreenCap/blob/master/src/screenCapturerImpl.cpp pourrait être le bon fichier. Je n'ai pas touché le code depuis des années. Le code est mal écrit, mais si vous voulez l'utiliser, je vais lancer une licence BSD là-bas. – Lalaland
Merci beaucoup @alaland pour répondre si vite! Si vous avez le temps, est-ce que je peux publier sur votre page de problèmes afin que je puisse comprendre comment cela fonctionne avec plusieurs moniteurs – Noitidart