我试图了解从中获得的数据XGetImage
是如何在内存中处理的:
XImage img = XGetImage(display, root, 0, 0, width, height, AllPlanes, ZPixmap);
现在假设我想分解红色、蓝色、绿色通道中的每个像素值。我怎样才能以便携的方式做到这一点?以下是一个示例,但它取决于 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;
//...
}
在上面的示例中,我假设RGB
通道的特定顺序pixel
以及像素是 24 位深度:事实上,我有img->depth=24
和img->bits_per_pixels=32
(屏幕也是 24 位深度)。但这不是一般情况。
作为第二步,我想摆脱 XGetPixel 并直接使用或描述 img->data。我需要知道的第一件事是,是否有任何东西Xlib
可以准确地为我提供解释图像是如何从img->data
现场开始构建所需的所有信息,它们是:
- 每个像素中 R、G、B 通道的顺序;
- 每个像素的位数;
- 每个通道的位数;
- 如果可能,相应的FOURCC