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

Line 是指向缓冲区中某个位置的指针。递增行将处理推进到缓冲区。

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 个元素,因此您需要适当地更新指针,否则您将两次读取相同的位置,当然,这是错误的。

于 2010-08-18T16:39:33.913 回答
1

在C/C++中,line行中的值实际上是一个数组的内存地址,line[1]实际上代表了变量所在地址处的值line加上一个1项的偏移量。(如果项目的类型line是 an int,则表示line加四字节的地址;既然是 a char,则表示line加一字节的地址。)

所以,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 回答