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 ビット深度です)。しかし、これは一般的なケースではありません。
2 番目のステップとして、XGetPixel を取り除き、img->data を直接使用または記述したいと考えています。最初に知っておく必要があるのは、フィールドXlib
から始めてイメージがどのように構築されるかを解釈するために必要なすべての情報を正確に提供してくれるものがあるかどうかです。img->data
- 各ピクセルの R、G、B チャネルの順序。
- 各ピクセルのビット数。
- 各チャネルのビット数。
- 可能であれば、対応するFOURCC