cs50 pset4反映图片滤镜代码问题
Cs50 pset4 reflect image filter code problem
我正在研究 cs50 pset4 练习滤镜,我完成了灰度滤镜和棕褐色滤镜,现在我正在研究反射滤镜。我应该水平反映这张图片:
正常
但我得到的只是:
反射
我不知道怎么了。我试着像视频中那样做。在我的代码中,我尝试将右侧像素放入一个临时变量,然后将左侧像素放入它们的位置,然后取出右侧像素并将它们放入左侧像素点。这是我的代码(仅反映部分):
// Reflect image horizontally
void reflect(int height, int width, RGBTRIPLE image[height][width])
{
for (int j = 0; j < height;j++)
{
for (int i = 0; i < width/2;i++)
{
RGBTRIPLE temp = image[j][i];
image[j][width - i] = image[i][j];
temp = image[j][width - i];
}
}
return;
}
请帮我理解。当我 googled 它时,我得到的只是一些不同的东西或整个练习的答案,这只是从 google.
复制粘贴
非常感谢,
迷失在代码中:)
您在保存之前覆盖图像[j][width - i]
你有一个交换 i,j 的案例。
我建议调换保存、覆盖、恢复的顺序
void reflect(int height, int width, RGBTRIPLE image[height][width])
{
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width/2; x++)
{
RGBTRIPLE temp = image[y][width -1 - x]; //save what gets overwritten
// then overwrite
image[y][width -1 - x] = image[y][x]; // note the wrong i,j which was here before
// then overwrite the other with what was saved
image[y][x] = temp;
}
}
return;
}
问题出在您的 [i][j] 上。应该是 [j][i]。
使用名称 x,y 这类问题更容易被发现。
谢谢 MikeCat 指出我犯的 off-by-one 错误。
RGBTRIPLE temp = image[j][i];
image[j][width - i] = image[i][j];
temp = image[j][width - i];
是错误的,因为
- 覆盖未保存的像素,而不是覆盖已保存的像素。
- 你不想在这里使用
image[i][j]
而不是 image[j][i]
。
width - i
应该是 width - i - 1
。例如,当i = 0
时,width - i
将是width
并且是out-of-range。
- 您覆盖了
temp
两次,而不是为两个像素分配新值。
应该是:
RGBTRIPLE temp = image[j][i];
image[j][i] = image[j][width - i - 1];
image[j][width - i - 1] = temp;
我正在研究 cs50 pset4 练习滤镜,我完成了灰度滤镜和棕褐色滤镜,现在我正在研究反射滤镜。我应该水平反映这张图片:
正常
但我得到的只是:
反射
我不知道怎么了。我试着像视频中那样做。在我的代码中,我尝试将右侧像素放入一个临时变量,然后将左侧像素放入它们的位置,然后取出右侧像素并将它们放入左侧像素点。这是我的代码(仅反映部分):
// Reflect image horizontally
void reflect(int height, int width, RGBTRIPLE image[height][width])
{
for (int j = 0; j < height;j++)
{
for (int i = 0; i < width/2;i++)
{
RGBTRIPLE temp = image[j][i];
image[j][width - i] = image[i][j];
temp = image[j][width - i];
}
}
return;
}
请帮我理解。当我 googled 它时,我得到的只是一些不同的东西或整个练习的答案,这只是从 google.
复制粘贴非常感谢, 迷失在代码中:)
您在保存之前覆盖图像[j][width - i]
你有一个交换 i,j 的案例。
我建议调换保存、覆盖、恢复的顺序
void reflect(int height, int width, RGBTRIPLE image[height][width])
{
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width/2; x++)
{
RGBTRIPLE temp = image[y][width -1 - x]; //save what gets overwritten
// then overwrite
image[y][width -1 - x] = image[y][x]; // note the wrong i,j which was here before
// then overwrite the other with what was saved
image[y][x] = temp;
}
}
return;
}
问题出在您的 [i][j] 上。应该是 [j][i]。 使用名称 x,y 这类问题更容易被发现。
谢谢 MikeCat 指出我犯的 off-by-one 错误。
RGBTRIPLE temp = image[j][i];
image[j][width - i] = image[i][j];
temp = image[j][width - i];
是错误的,因为
- 覆盖未保存的像素,而不是覆盖已保存的像素。
- 你不想在这里使用
image[i][j]
而不是image[j][i]
。 width - i
应该是width - i - 1
。例如,当i = 0
时,width - i
将是width
并且是out-of-range。- 您覆盖了
temp
两次,而不是为两个像素分配新值。
应该是:
RGBTRIPLE temp = image[j][i];
image[j][i] = image[j][width - i - 1];
image[j][width - i - 1] = temp;