目前,我正在做 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;
}
你能帮我一下吗?
您有 2 个错误:
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;
}
然后交换像素,因为我们要交换一半,请确保运行 j 以获得宽度/2
以下代码供您参考:
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;
}
// Reflect image horizontally
void reflect(int height, int width, RGBTRIPLE image[height][width])
{
for (int i = 0; i < height; i++) /*per column*/
{
RGBTRIPLE temp[height][width];
int n = width;
int j = 0;
do /*copy in temp file*/
{
temp[i][width - 1] = image[i][j];
j++;
width--;
}
while (width != 0);
j = 0;
width = n;
do
{
image[i][j] = temp[i][j];
j++;
}
while (j != width);
}
return;
}