c - 当我将像素乘以比例因子时图像变黑

标签 c image colors pixel

void scale_brightness( uint8_t array[],
               unsigned int cols,
               unsigned int rows,
               double scale_factor )
{
    for (int x = 0; x < (cols*rows); x++)
    {
        array[x] = round(scale_factor * (double)(array[x]));
        if (array[x] > 255 )
        {
            array[x] = 255;
        }
    }

}

此函数应该将像素乘以比例因子,并根据乘以该因子使图像变亮或变暗。如果相乘的图像大于 255,则像素阈值为 255。我尝试了代码并输入了 scale_brightness(数组、256、256、2)。这应该将每个像素乘以 2,因此它应该使图像变亮。但是当我运行它时,它变成了黑色,与它应该做的完全相反。我也试过做0,结果变黑了。任何其他颜色只会给我一种深灰色。有人能帮我找出为什么会这样吗?

最佳答案

您的逻辑不起作用,因为 array[x] 不能超过 255,所以 if 主体永远不会执行,并且 array[x] 只是被截断了。使用额外的 double 值进行计算:

    double d = round(scale_factor * (double)(array[x]));
    if (d >= 255.0 )
    {
        array[x] = 255;
    }
    else
    {
        array[x] = (uint8_t)d;
    }

请注意,可以通过排除浮点运算来有效优化此循环。乘以 double 因子可以替换为乘以 int 并右移。

关于c - 当我将像素乘以比例因子时图像变黑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26954876/

相关文章:

c# - 我可以在 C# 4.0 中指定默认的 Color 参数吗?

delphi - 用颜色填充自定义区域

c - 是否有一种内置信号量结构允许等待多个资源?

swift - 快速从相机滚动的图像中获取创建日期

Java颜色检测

java - 使用 ImageIO 加载 8 位灰度图像

c# - 如何将图像添加到我的 .resx 文件中?

c - OpenSSL ASN1_TYPE 和 ASN1_ITEM 是如何关联的

c - 在传递给函数本身的指针上调用 realloc() 是否安全?

c - Linux 从串口读取数据