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;