Tôi đang cố chụp ảnh màn hình để sử dụng trong truyền hình. Vì vậy, tôi cần một giải pháp nhanh, và không thể dựa vào các chương trình shell như import hay xwd.Làm cách nào để chụp ảnh màn hình chính xác với xlib?
Đây là mã tôi đã viết cho đến nay, nhưng nó không thành công và cho tôi một hình ảnh rác, mà dường như chỉ ra những mảnh của một số hình ảnh với màu sắc lẻ ném với nhau.
http://s9.postimage.org/dqnkgkwr1/blah.png
Bất kỳ ý tưởng nào về những gì tôi đang làm sai?
#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;
}
Xin chào @lalaland, bạn có thể chia sẻ mã cuối cùng của mình không, điều này có hỗ trợ nhiều màn hình không? – Noitidart
@Noitidart Có, tôi đã hỗ trợ nhiều màn hình. Tôi nghĩ https://github.com/Lalaland/ScreenCap/blob/master/src/screenCapturerImpl.cpp có thể là tệp phù hợp. Đã không chạm vào mã trong năm mặc dù. Mã này được viết kém, nhưng nếu bạn muốn sử dụng nó, tôi sẽ ném một giấy phép BSD lên đó. – Lalaland
Cảm ơn rất nhiều @ lalaland đã trả lời rất nhanh! Nếu bạn có thời gian là ok nếu tôi đăng trên trang vấn đề của bạn vì vậy tôi có thể hiểu làm thế nào nó hoạt động với nhiều màn hình – Noitidart