我正在编写一个灰度函数,我正在使用
round()
来舍入 RGB 颜色的平均值,但是在测试它时,舍入函数不会舍入答案 > x.5,而是将所有内容舍入。
我尝试将我的 int avg 更改为 float avg 并使用
round()
,但没有用。我尝试使用roundf()
,没有用。例如,当红色、绿色和蓝色的值为 27、28、28 时,我得到平均 27 而不是正确的 28。
我的代码:
void grayscale(int height, int width, RGBTRIPLE image[height][width])
{
int avg = 0;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
avg = round((image[i][j].rgbtRed + image[i][j].rgbtGreen + image[i][j].rgbtBlue) / 3);
image[i][j].rgbtRed = avg;
image[i][j].rgbtGreen = avg;
image[i][j].rgbtBlue = avg;
}
}
return;
}
在 C 中,操作是使用取决于操作数的类型执行的。对于整数操作数,使用整数类型。
在
(image[i][j].rgbtRed + image[i][j].rgbtGreen + image[i][j].rgbtBlue) / 3
中,所有操作数都是整数,因此使用整数类型(在本例中为int
)进行运算。这个表达式是 round
的子表达式,它接受一个 double
,这一事实并不影响这个子表达式的计算。这个子表达式使用int
算术求值,然后将结果转换为double
传递给round
.
不需要用
round
取整。由于这些值都是非负整数,因此它们的和有 0、1 或 2 模 3 的余数。如果您在除以 3 之前简单地在总和上加 1,您将得到一个四舍五入的结果:
avg = (image[i][j].rgbtRed + image[i][j].rgbtGreen + image[i][j].rgbtBlue + 1) / 3;
round((image[i][j].rgbtRed + image[i][j].rgbtGreen + image[i][j].rgbtBlue) / 3)
你加在一起的值都是整数。然后你除以一个整数。在调用
round
之前,结果是一个整数。当调用 round
时,27
变为 27.0
,但这只是四舍五入到 27
.
在您的示例中,27 + 28 + 28 = 83。83 / 3 是 27.666...7。但是整数数学不考虑小数部分所以你得到 27.
简单的解决方案:除以浮点数。
round((image[i][j].rgbtRed + image[i][j].rgbtGreen + image[i][j].rgbtBlue) / 3.0)
你现在将从除法中得到一个可以四舍五入的浮点数。