CS50 pset4 棕褐色滤镜

问题描述 投票:0回答:2

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

下图是我的错误图片

我尝试在 VS code 中运行该程序,它给出了所需的输出。但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;
}
c cs50
2个回答
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);

成员

rgbtRed
rgbtGreen
rgbtBlue
只有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);

0
投票

这段代码在 CS50 中对我有用

void sepia(int height, int width, RGBTRIPLE image[height][width])
{
for ( int i = 0; i < height; i++)
{
    for (int j = 0; j < width; j++)
    {

        int sepiaShadeR = round(0.393*image[i][j].rgbtRed + 0.769*image[i] 
[j].rgbtGreen + 0.189*image[i][j].rgbtBlue);
        int sepiaShadeG = round(0.349*image[i][j].rgbtRed + 0.686*image[i] 
[j].rgbtGreen + 0.168*image[i][j].rgbtBlue);
        int sepiaShadeB = round(0.272*image[i][j].rgbtRed + 0.534*image[i] 
[j].rgbtGreen + 0.131*image[i][j].rgbtBlue);
        if (sepiaShadeR > 255)
        {
            sepiaShadeR = 255;
        }
        if (sepiaShadeG > 255)
        {
            sepiaShadeG = 255;
        }
        if (sepiaShadeB > 255)
        {
            sepiaShadeB = 255;
        }
        image[i][j].rgbtRed = sepiaShadeR;
        image[i][j].rgbtGreen = sepiaShadeG;
        image[i][j].rgbtBlue = sepiaShadeB;
    }
}
return;
}
© www.soinside.com 2019 - 2024. All rights reserved.