0

我正在使用 C 和 OpenGL 中的图像在窗口中显示它们。我有一个这样的结构:

typedef struct imagemRGB ImagemRGB;
struct imageRGB {
    int  width;        
    int height;        
    PixelRGB **pixel;
};

where**pixel是表示图像中每个像素及其颜色的矩阵。PixelRGB 是这样的结构:

typedef unsigned char Byte;

typedef Byte Boolean;

/*-------------------------------------------------------------*/
/* pixel True Color */
/* http://en.wikipedia.org/wiki/True_Color#True_color_.2824-bit.29 */
typedef struct pixelRGB PixelRGB;
struct pixelRGB {
  Byte    red;         /* valor entre 0 e 255 */
  Byte    green;       /* valor entre 0 e 255 */
  Byte    blue;        /* valor entre 0 e 255*/
  Boolean visited;    /* TRUE ou FALSE */ 
};

我有一个函数签名,它是:

void copyImageRGB (ImageRGB *target, ImageRGB *origin);

该函数应该将图像结构( 和 each )复制widthheightpixel因此target我可以从一开始就存储 OriginalImage ;

我正在用这段代码实现它:

copyImageRGB (ImageRGB *target, ImageRGB *origin)
{
int i, j;

target->width = origin->width;
target->height = origin->height;
for(i = 0; i < origin->height; i++)
  for(j = 0; j < origin->width; j++)
  {
    target->pixel[i][j].red = origin->pixel[i][j].red;
    target->pixel[i][j].blue = origin->pixel[i][j].blue;
    target->pixel[i][j].green = origin->pixel[i][j].green;
  }
}

但我不确定它是否会按预期工作,main因为它的参数是局部变量。我对吗?我该如何实现这个功能,以便我可以做到:copyImageRGB(target, originalImage);在我的main?

4

2 回答 2

2

不完全确定您的问题是什么,但只要两个参数都是指向有效对象的指针,该函数应该可以正常工作。您确实需要在 copyImageRGB() 中为像素矩阵分配内存。例如,类似以下的东西应该可以工作。

copyImageRGB (ImageRGB *target, ImageRGB *origin)
{
int i, j;

target->width = origin->width;
target->height = origin->height;
target->pixel = (PixelRGB**)malloc(sizeof(PixelRGB[origin->height][origin->width])); // <------ NOTE memory allocation
for(i = 0; i < origin->height; i++)
  for(j = 0; j < origin->width; j++)
  {
    target->pixel[i][j].red = origin->pixel[i][j].red;
    target->pixel[i][j].blue = origin->pixel[i][j].blue;
    target->pixel[i][j].green = origin->pixel[i][j].green;
  }
}


int main() {
    ImageRGB originalImage;

    // initialize originalImage somehow

    ImageRGB target;

    copyImageRGB(&target, &originalImage);
}
于 2013-09-08T07:52:11.097 回答
1

只要您在调用copyImageRGB函数时局部变量仍然存在,您的代码就可以工作(编译),但是,您需要pixel在目标中分配字段,因为它只是指向指针的指针。你可以在里面做main,但在里面分配它可能是一个更好的选择copyImageRGB

copyImageRGB (ImageRGB *target, ImageRGB *origin)
{
int i, j;
target->pixel = malloc(sizeof(PixelRGB) * origin->height * origin->width);
target->width = origin->width;
target->height = origin->height;
for(i = 0; i < origin->height; i++)
  for(j = 0; j < origin->width; j++)
  {
    target->pixel[i][j].red = origin->pixel[i][j].red;
    target->pixel[i][j].blue = origin->pixel[i][j].blue;
    target->pixel[i][j].green = origin->pixel[i][j].green;
  }
}

不要忘记释放您的像素!

int main()
{
    ImageRGB src = /* Get is somehow */;
    ImageRGB target;

    copyImageRGB(&target, &src);
    free(src->pixel);
    free(target->pixel);
    return 0;
} 

此外,您可以将指针用作局部变量,但您需要确保分配target结构:

int main()
{
    ImageRGB *src = /* Get it somehow */;
    ImageRGB *target = malloc(sizeof(ImageRGB));

    copyImageRGB(target, src);

    // Don't forget to free!
    free(src->pixel);
    free(src);
    free(target->pixel);
    free(target);

    return 0;

}
于 2013-09-08T07:50:33.590 回答