我想尽可能快地执行屏幕截图(或屏幕截图)。
谷歌搜索这个问题带来了许多回答,但我的关注更具体:
我对图像本身不感兴趣,我想近乎实时地抓住屏幕亮度,而不是硬件亮度,而是图像一,因为,例如,firefox白色谷歌页面给出了更明亮的图像而不是一个黑暗的xterm(当两者都被最大化时)。
为了让我尽可能清楚,这是我已经设法用X11和CImg库实现的一种方式:
以下是标题:
#include <CImg.h>
using namespace cimg_library;
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xos.h>
和提取X11图像并在非常像素上进行循环的核心部分:
Display *display = XOpenDisplay(NULL);
Window root = DefaultRootWindow(display);
Screen* screen = DefaultScreenOfDisplay(display);
const int W = WidthOfScreen(screen);
const int H = HeightOfScreen(screen);
XImage *image = XGetImage(display, root, 0, 0, W, H, AllPlanes, ZPixmap);
unsigned long red_count(0), green_count(0), blue_count(0), count(0);
const unsigned long red_mask = image->red_mask;
const unsigned long green_mask = image->green_mask;
const unsigned long blue_mask = image->blue_mask;
CImg<unsigned char> screenshot(W, H, 1, 3, 0);
for (int x = 0; x < W; x += pixel_stride)
for (int y = 0; y < H; y += pixel_stride)
{
unsigned long pixel = XGetPixel(image, x, y);
screenshot(x, y, 0) = (pixel & red_mask) >> 16;
screenshot(x, y, 1) = (pixel & green_mask) >> 8;
screenshot(x, y, 2) = pixel & blue_mask;
red_count += (int) screenshot(x, y, 0);
green_count += (int) screenshot(x, y, 1);
blue_count += (int) screenshot(x, y, 2);
count++;
}
正如我所说,我不保留图像本身,我只是尝试用红色,绿色和蓝色像素的相应值计算平均亮度值。
XFree(image);
const double luminance_relative = (red_luminance * double(red_count) +
green_luminance * double(green_count) +
blue_luminance * double(blue_count))
/ (double(255) * double(count));
基本思想是根据图像亮度调整硬件屏幕亮度。简而言之,屏幕截图越白,亮度就越低,反之亦然。
我想这样做是因为我有敏感的眼睛,当我从xterm切换到firefox时,它通常会伤到我的眼睛。
为此,必须在很短的时间内调整硬件亮度,屏幕截图,即像素循环必须尽可能快。
我开始用X11方法实现它,但我想知道是否可以有更快的访问方法?问题是:获取屏幕截图的最快方式/库是什么?
提前感谢您的帮助。
此致