linux - 如何解释 XImage 的字段 'data'

标签 linux x11 xlib xserver

我想了解从 XGetImage 获取的数据是如何在内存中处理的:

XImage img = XGetImage(display, root, 0, 0, width, height, AllPlanes, ZPixmap);

现在假设我想分解红色、蓝色、绿色 channel 中的每个像素值。我怎样才能以便携的方式做到这一点?以下是一个示例,但它取决于 XServer 的特定配置,并非在所有情况下都有效:

for (int x = 0; x < width; x++)
    for (int y = 0; y < height; y++) {
        unsigned long pixel = XGetPixel(img, x, y);   
        unsigned char blue = pixel & blue_mask;
        unsigned char green = (pixel & green_mask) >> 8;
        unsigned char red = (pixel & red_mask) >> 16;
        //...    
    }

在上面的示例中,我假设 pixel 中的 RGB channel 具有特定顺序,并且像素是 24 位深度:事实上,我有 img->depth=24img->bits_per_pixels=32(屏幕也是24位深度)。但这不是一般情况。

作为第二步,我想摆脱 XGetPixel 并直接使用或描述 img->data。我需要知道的第一件事是 Xlib 中是否有任何东西可以准确地为我提供解释如何从 img->data 开始构建图像所需的所有信息> 字段,它们是:

  1. 每个像素中 R、G、B channel 的顺序;
  2. 每个像素的位数;
  3. 每个 channel 的位数;
  4. 如果可能,相应的FOURCC

最佳答案

移位是掩码的一个简单函数:

    int get_shift (int mask) {
      shift = 0;
      while (mask) {
        if (mask & 1) break;
        shift++;
        mask >>=1;
      }
      return shift;
    }

每个 channel 中的位数就是其掩码中 1 的位数(数一数)。 channel 顺序由位移决定(如果红移为0,则第一个 channel 为R,等等)。

我认为 bits_per_pixel 的有效值是 1、2、4、8、15、16、24 和 32(15 和 16 位是相同的每像素 2 字节格式,但前者有 1 位未使用)。我认为除了 24 和 32 bpp 之外,任何人都不值得花时间去支持任何东西。

X11 不关心媒体文件,所以没有 4CC 代码。

关于linux - 如何解释 XImage 的字段 'data',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14224293/

相关文章:

linux - Python ImportError no module named statistics 下载后

php - 是否可以在服务器上运行 AfterEffects 以使用动态图像动态渲染视频?

x11 - xinput 触摸屏校准不一致

c - 如果新窗口为 x11,则自动对焦

gdb - xlib集成调试(Tracing)

python - Tkinter 消息框在按下“确定/确认”后不会消失

linux - 需要在 linux 中使用一个衬里来触摸多个目录中的文件

macos - 所有 X11 应用程序在 Mac OSX Yosemite 中都不可用

c - 使用 openGL 和/或 X11 的截图

c - X11透明窗口: click-through only where alpha = 0