目前,我正在做pset4无过滤器,反映和挣扎与我写的代码。它编译得很好,但是输出图片看起来与输入图片完全一样。我试图首先将反射图像存储在临时数组中,并将其传输到图像数组。我找不到任何做过类似尝试的人。这是我到目前为止所写的。
void reflect(int height, int width, RGBTRIPLE image[height][width])
{
int i; //row
int j; //column for img
int z; //column of tmp img
RGBTRIPLE tmpi[height][width]; //tmp img
for (i = 0; i < height; i++)
{
for (j = 0, z = width; j > z; j++, z--)
{
image[i][j].rgbtRed = tmpi[i][z].rgbtRed;
image[i][j].rgbtBlue = tmpi[i][z].rgbtBlue;
image[i][j].rgbtGreen = tmpi[i][z].rgbtGreen;
}
}
for (i = 0; i < height; i ++)
{
for (j = 0; j < width; j++)
{
tmpi[i][j].rgbtRed = image[i][j].rgbtRed;
tmpi[i][j].rgbtBlue = image[i][j].rgbtBlue;
tmpi[i][j].rgbtGreen = image[i][j].rgbtGreen;
}
}
return;
}
你能帮帮我吗?
你有两个错误:
- 首先复制未初始化的内存。
for (i = 0; i < height; i++)
{
for (j = 0, z = width; j > z; j++, z--)
{
image[i][j].rgbtRed = tmpi[i][z].rgbtRed;
数组tmpi
包含不确定的值,因为您从未对其赋值。
您首先需要将数组复制到tmpi
,然后才能将其复制回来。
- 你的循环限制是错误的:
for (j = 0, z = width; j > z; j++, z--)
{
image[i][j].rgbtRed = tmpi[i][z].rgbtRed;
...
- 这里
z
只能上升到width-1
。 j>z
条件错误。这永远不会是真的。- 正确的条件是
j<width
。 - 不是错误,但你并不需要
z
。使用width-j-1
- 也不是错误,但不需要复制结构体的每个成员。你可以一次赋值整个结构体。
一个固定的版本看起来像这样:
void reflect(int height, int width, RGBTRIPLE image[height][width])
{
int i; //row
int j; //column for img
RGBTRIPLE tmpi[height][width]; //tmp img
for (i = 0; i < height; i ++)
{
for (j = 0; j < width; j++)
{
tmpi[i][j] = image[i][j];
}
}
for (i = 0; i < height; i++)
{
for (j = 0; j < width; j++)
{
image[i][j] = tmpi[i][width - j - 1];
}
}
return;
}
或者你甚至可以组合外部循环:
void reflect(int height, int width, RGBTRIPLE image[height][width])
{
int i; //row
int j; //column for img
RGBTRIPLE tmpi[height][width]; //tmp img
for (i = 0; i < height; i ++)
{
for (j = 0; j < width; j++)
{
tmpi[i][j] = image[i][j];
}
for (j = 0; j < width; j++)
{
image[i][j] = tmpi[i][width - j - 1];
}
}
return;
}
或者你可以在适当的地方交换值:
void reflect(int height, int width, RGBTRIPLE image[height][width])
{
int i; //row
int j; //column for img
for (i = 0; i < height; i ++)
{
for (j = 0; j < width / 2; j++)
{
RGBTRIPLE temp = image[i][j];
image[i][j] = image[i][width - j - 1];
image[i][width - j - 1] = temp;
}
}
return;
}
可以自由地考虑更多的优化,一旦它正常工作。
您正在重新初始化颜色字节,而我们需要在这里交换出像素,我建议首先创建一个这样的交换函数:
void swap (RGBTRIPLE *a, RGBTRIPLE *b)
{
RGBTRIPLE temp = *a;
*a = *b;
*b = temp;
}
然后交换像素,当我们交换到一半时确保为width/2运行j
下面的代码供您参考:
void reflect(int height, int width, RGBTRIPLE image[height][width])
{
for (int i = 0; i < height; i++)
{
int k = width - 1;
for (int j = 0; j < width/2; j++)
{
swap(&image[i][j], &image[i][k]);
k--;
}
}
return;
}