我正在编写一个灰度函数,我使用round()来对RGB colored颜色 的平均值进行舍入,但在测试它时,该函数不会对答案进行舍入>x.5,而是将所有内容向下舍入.

我试着把我的整型平均数改成浮点型平均数,然后用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;
}

推荐答案

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)

现在,您将从除法中得到一个可以四舍五入的浮点数.

C++相关问答推荐

在严格的C89模式下,收件箱不会在' uint64_t '上发出警告

C限制限定符是否可以通过指针传递?

单指针和空参数列表之间的函数指针兼容性

在使用GTK 4 Columnview列表模型时,如何为多列添加排序函数.C编码,Linux/GNOME环境

如何在C中从函数返回指向数组的指针?

如何使用低级C++写出数值

ESP32在vTaskDelay上崩溃

带有sigLongjMP中断I/O的异常处理程序

Clang:如何强制运行时错误的崩溃/异常由于-fsanitize=undefined

判断X宏的空性

Vcpkg的配置文件

这个C程序在工作中途停止获取输入.我收到分段故障(核心转储).我还是不知道问题出在哪里

C:面筋蛋白';为什么不刷新窗口?

关于不同C编译器中的__attribute__支持

在NASM中链接Linux共享库时出错-';将R_ X86_64_;foo';

共享内存未授予父进程权限

Ubuntu编译:C中的文件格式无法识别错误

既然我们在 if 中将 int 的值更改为 10,为什么在第二个 fork 后,子进程及其创建的子进程都会打印 33 ?

C 错误:对 int 数组使用 typedef 时出现不兼容的指针类型问题

使用fread()函数读取txt文件