This question is similar to this one
Fastest method of screen capturing
but for linux/X11.
To be more specific, i need a method to capture the pixel
You can use xwd(1) to dump a X11 window (and xwud(1) to display it). ImageMagick and the Netpbm tools know how to deal with the XWD format. But these are not especially fast. And they will not reveal hidden portions of a window.
This is possible using VirtualGL in a server with hardware acceleration. Basically just configure the server appropiately, then either on the same machine or on a machine in the same network, run
export DISPLAY=<your xvfb display>
vglrun <your_app>
This will have the following advantages:
1) your app will render using virtualGL, which will use the hardware
2) VirtualGL will display your 3D context inside the Xfvb display, which will only render the 2D widgets in CPU
3) configure Xvfb to render to a framebuffer
4) profit!
I'd grab the sources for gnome-screenshot
, or some other existing open-source tool, and figure out how they do it.
You can find the sources Ubuntu uses here: http://packages.ubuntu.com/quantal/gnome-screenshot
But, don't forget to check the license before you cut and paste large sections of code!
I've seen comments saying this can't be done in X11 so there may be something I don't understand but i am able to capture my screen using the following code.
#include <X11/Xlib.h> //-lX11
#include <X11/Xutil.h>
#include <X11/Xmd.h>
#include <X11/Xatom.h>
#include <jpeglib.h> //-ljpeg
void CopyDesktopImage(std::string sFilePath_Name)
{
Display *dis=XOpenDisplay((char *)0);
Screen *scr = XDefaultScreenOfDisplay(dis);
Drawable drawable = XDefaultRootWindow(dis);
XImage *image = XGetImage(dis, drawable, 0, 0, scr->width, scr->height, AllPlanes, ZPixmap);
Save_XImage_to_JPG(image, sFilePath_Name.c_str(), 75);
XDestroyImage(image);
XCloseDisplay(dis);
}
void Save_XImage_to_JPG(XImage *image, std::string FileName, int Quality)
{
FILE* outfile = fopen(FileName.c_str(), "wb");
if(outfile == NULL) return;
jpeg_compress_struct cinfo;
jpeg_error_mgr jerr;
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_compress(&cinfo);
jpeg_stdio_dest(&cinfo, outfile);
cinfo.image_width = image->width;
cinfo.image_height = image->height;
cinfo.input_components = image->bitmap_unit >> 3;
cinfo.in_color_space = JCS_EXT_BGRX;
jpeg_set_defaults(&cinfo);
/*set the quality [0..100] */
jpeg_set_quality(&cinfo, Quality, true);
jpeg_start_compress(&cinfo, true);
JSAMPROW row_pointer; /* pointer to a single row */
while (cinfo.next_scanline < cinfo.image_height)
{
row_pointer = (JSAMPROW) &image->data[cinfo.next_scanline*image->bytes_per_line];
jpeg_write_scanlines(&cinfo, &row_pointer, 1);
}
jpeg_finish_compress(&cinfo);
fclose(outfile);
}
What you can do with a tricky hack in your local network is using the X remote capability open your X listen port and then using env var to set the export to X listen port then using XscreenCapture
Xpaint is a very old X11 utility built using the MIT Athena widget set. File > Take Snapshot will grab a window or mouse-selected rectangle from screen.
OR
MagiCapture is a screen capture and preview utility for the X Window System. A user may capture a single window, a single window with decorations, a rectangular region of the display, or the entire display itself. The user may save the captured image into a graphics file supported by the ImageMagick toolkit, which supports most (if not all) popular graphics formats. MagiCapture uses the GLIB and GTK+ libraries for the user interface and the ImageMagick and GdkMagick library for all graphics processing. Requires ImageMagick.
OR
Zscreen:- This Windows-only screen capture app has tons of features. It grabs a shot of the active window, a selected window, or the entire screen. Once you've got the image, automatically open it in your image editor or upload it to Twitpic, YFrog, Flickr, or one of several other supported services. ZScreen caches all your images, even ones on the clipboard, so there's always a history of your screenshots right at your fingertips.