1
// Create test video frame
void CreateFrame(char * buffer, int w, int h, int bytespan)
{
  int wxh = w * h;
  static float seed = 1.0;
  for (int i = 0; i < h; i ++)
  {
    char* line = buffer + i * bytespan;
    for (int j = 0; j < w; j ++)
    {
      // RGB
      line[0] = 255 * sin(((float)i / wxh * seed) * 3.14);
      line[1] = 255 * cos(((float)j / wxh * seed) * 3.14);
      line[2] = 255 * sin(((float)(i + j) / wxh * seed) * 3.14);
      line += 3;
    }
  }
  seed = seed + 2.2;
}

誰かが私に何のために背を向けてもらえますline += 3;か?

そして、C#でそのような関数アナログを作成する方法は?

4

5 に答える 5

5

line += 3次のピクセルを指すように、ポインターlineを 3 バイトずつインクリメントします。 lineこれは 3 バイトのピクセルへのポインタなので、実際には のように別の名前にする必要がありますpPixel

于 2010-08-18T16:38:25.607 に答える
3

行は、バッファー内の位置へのポインターです。行をインクリメントすると、処理がバッファの下に進みます。

AC# アナログは次のようになります。

static float seed = 1.0f;
static void CreateFrame(byte[] buffer, int w, int h, int bytespan)
{
  int wxh = w * h;
  for (int i = 0; i < h; i ++)
  {
    int line = i * bytespan;
    for (int j = 0; j < w; j ++)
    {
      // RGB
      buffer[line + 0] = (byte)(255 * Math.Sin(((float)i / wxh * seed) * 3.14));
      buffer[line + 1] = (byte)(255 * Math.Cos(((float)j / wxh * seed) * 3.14));
      buffer[line + 2] = (byte)(255 * Math.Sin(((float)(i + j) / wxh * seed) * 3.14));
      line += 3;
    }
  }
  seed = seed + 2.2f;
}
于 2010-08-18T16:39:24.997 に答える
1

これはポインター演算です。配列の 3 つの要素を一度に処理するため、ポインターを適切に更新する必要があります。そうしないと、同じ場所を 2 回読み取り、もちろん誤って読み取ることになります。

于 2010-08-18T16:39:33.913 に答える
1

C/C++ では、line行の値は実際には配列のメモリ アドレスであり、line[1]実際には変数のアドレスにline1 アイテム オフセットを加えた値を表します。(の項目の型が の場合lineはプラス4バイトのintアドレスを意味し、 はプラス1バイトのアドレスを意味します。)linecharline

したがって、はと同等line += 3であることを意味します。コーダーは次のようにコードを記述できます。line[1][old "line" value][4]

for (int j = 0; j < w; j ++)
{
  // RGB
  line[(3 * j)] = 255 * sin(((float)i / wxh * seed) * 3.14);
  line[(3 * j) + 1] = 255 * cos(((float)j / wxh * seed) * 3.14);
  line[(3 * j) + 2] = 255 * sin(((float)(i + j) / wxh * seed) * 3.14);
}
于 2010-08-18T16:39:35.667 に答える
1

次のように、ポインタをバイト配列に置き換え、整数でインデックス付けします。

// Create test video frame
void CreateFrame(byte[] buffer, int w, int h, int bytespan)
{
  int wxh = w * h;
  static float seed = 1.0;
  for (int i = 0; i < h; i ++)
  {
    int line = i * bytespan;
    for (int j = 0; j < w; j ++)
    {
      // RGB
      buffer[line + 0] = 255 * sin(((float)i / wxh * seed) * 3.14);
      buffer[line + 1] = 255 * cos(((float)j / wxh * seed) * 3.14);
      buffer[line + 2] = 255 * sin(((float)(i + j) / wxh * seed) * 3.14);
      line += 3;
    }
  }
  seed = seed + 2.2;
}

たとえ私lineが理解していることからしても、それは実際には行ではありません。

于 2010-08-18T16:46:13.653 に答える