所以我尝试为棕褐色过滤器编写代码,但它对于极端情况无法正常工作。我没有发现任何问题。但提示错误。
下图是我的错误图片
我尝试在 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;
}
你的
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);
这段代码在 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;
}