执行屏幕截图的最快方式

时间:2017-01-23 19:53:43

标签: image-processing screenshot

我想尽可能快地执行屏幕截图(或屏幕截图)。

谷歌搜索这个问题带来了许多回答,但我的关注更具体:

我对图像本身不感兴趣,我想近乎实时地抓住屏幕亮度,而不是硬件亮度,而是图像一,因为,例如,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方法实现它,但我想知道是否可以有更快的访问方法?问题是:获取屏幕截图的最快方式/库是什么?

提前感谢您的帮助。

此致

0 个答案:

没有答案