3

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

  1. 各ピクセルの R、G、B チャネルの順序。
  2. 各ピクセルのビット数。
  3. 各チャネルのビット数。
  4. 可能であれば、対応するFOURCC
4

2 に答える 2

4

シフトはマスクの単純な関数です。

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

各チャネルのビット数は、マスク内の 1 ビットの数です (それらを数えます)。チャネルの順序はシフトによって決まります (赤方偏移が 0 の場合、最初のチャネルは R など)。

bits_per_pixel の有効な値は 1、2、4、8、15、16、24、32 だと思います (15 ビットと 16 ビットは同じ 2 バイト/ピクセル形式ですが、前者は 1 ビット未使用です)。24 bpp と 32 bpp 以外をサポートするのに時間をかける価値はないと思います。

X11 はメディア ファイルに関係がないため、4CC コードはありません。

于 2013-01-13T22:18:16.160 に答える