gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 11:05:08 24 4
gpt4 key购买 nike

我想了解从 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com