我想了解从 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=24
和img->bits_per_pixels=32
(屏幕也是24位深度)。但这不是一般情况。
作为第二步,我想摆脱 XGetPixel 并直接使用或描述 img->data。我需要知道的第一件事是 Xlib
中是否有任何东西可以准确地为我提供解释如何从 img->data
开始构建图像所需的所有信息> 字段,它们是:
- 每个像素中 R、G、B channel 的顺序;
- 每个像素的位数;
- 每个 channel 的位数;
- 如果可能,相应的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/