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