मैं स्क्रीनकास्टिंग में उपयोग के लिए स्क्रीन की एक छवि को कैप्चर करने की कोशिश कर रहा हूं। इस प्रकार मुझे एक तेज समाधान की आवश्यकता है, और आयात या xwd जैसे शैल कार्यक्रमों पर भरोसा नहीं कर सकता।xlib के साथ स्क्रीनशॉट को सही तरीके से कैसे लें?
यह कोड मैंने अभी तक लिखा है, लेकिन यह विफल रहता है और मुझे एक जंक छवि देता है, जो कि कई छवियों के टुकड़े दिखाता है, जिसमें अजीब रंग एक साथ फेंकते हैं।
http://s9.postimage.org/dqnkgkwr1/blah.png
मैं गलत क्या कर रहा हूँ पर कोई भी विचार?
printf("%ld %ld %u %u %u\n",x,y,pic.offset(x,y,0),pic.offset(x,y,1),pic.offset(x,y,2));
यह पैदावार (:
#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;
}
हाय @ लालैंडैंड क्या आप अपना अंतिम कोड साझा कर सकते हैं, क्या यह बहु मॉनीटर का समर्थन करता है? – Noitidart
@ नोइटिडार्ट हां, मैंने एकाधिक मॉनीटर का समर्थन किया। मुझे लगता है कि https://github.com/Lalaland/ScreenCap/blob/master/src/screenCapturerImpl.cpp सही फ़ाइल हो सकती है। यद्यपि वर्षों में कोड को छुआ नहीं है। कोड खराब लिखा गया है, लेकिन यदि आप इसका उपयोग करना चाहते हैं, तो मैं वहां एक बीएसडी लाइसेंस फेंक दूंगा। – Lalaland
उत्तर के लिए बहुत बहुत धन्यवाद @lalaland धन्यवाद! यदि आपके पास समय है तो यह ठीक है अगर मैंने आपके मुद्दों पर पोस्ट किया है तो मैं समझ सकता हूं कि यह बहु मॉनीटर – Noitidart