CS50 pset4的棕褐色滤镜

时间:2021-04-24 16:07:34

标签: c cs50

所以我尝试为棕褐色过滤器编写代码,但它在极端情况下无法正常工作。我没有发现任何问题。但是正在提示错误。

下图是我的错误图片

我尝试在 VS 代码中运行该程序,它提供了所需的输出。但是check50提示错误信息。

void sepia(int height, int width, RGBTRIPLE image[height][width])
{
    for(int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            float r = image[i][j].rgbtRed;
            float g = image[i][j].rgbtGreen;
            float b = image[i][j].rgbtBlue;

            image[i][j].rgbtRed = round(0.393*r + 0.769*g + 0.189*b);
            image[i][j].rgbtGreen = round(0.349*r + 0.686*g + 0.168*b);
            image[i][j].rgbtBlue = round(0.272*r + 0.534*g + 0.131*b);

            if (image[i][j].rgbtRed > 255)
            {
                image[i][j].rgbtRed = 255;
            }

            if (image[i][j].rgbtGreen > 255)
            {
                image[i][j].rgbtGreen = 255;
            }

            if (image[i][j].rgbtBlue > 255)
            {
                image[i][j].rgbtBlue = 255;
            }

        }
    }
    return;
}

1 个答案:

答案 0 :(得分:0)

您的 sepia 函数几乎是正确的。你只是错过了

            image[i][j].rgbtRed = round(0.393*r + 0.769*g + 0.189*b);
            image[i][j].rgbtGreen = round(0.349*r + 0.686*g + 0.168*b);
            image[i][j].rgbtBlue = round(0.272*r + 0.534*g + 0.131*b);

成员 rgbtRedrgbtGreenrgbtBlue 只有 8 位,并且将浮点类型值从 256 分配给它们的行为是未定义的;以下用于限制值的代码不起作用。因此,在分配 RGB 值之前对其进行上限:

            image[i][j].rgbtRed   = fmin(round(0.393*r + 0.769*g + 0.189*b), 255);
            image[i][j].rgbtGreen = fmin(round(0.349*r + 0.686*g + 0.168*b), 255);
            image[i][j].rgbtBlue  = fmin(round(0.272*r + 0.534*g + 0.131*b), 255);