繁体   English   中英

使用 C++ 调整位图图像亮度/对比度

[英]adjust bitmap image brightness/contrast using c++

使用 C++ 调整图像亮度/对比度而不使用任何其他 3rd 方库或依赖项

独立 JPEG 库一样使用库读入图像。 当您拥有原始数据时,您可以将其从 RGB转换为 HSL 或(最好)CIE L a b*。 对比度和亮度基本上都只涉及对 L 通道的调整——要调整亮度,只需将所有 L 值向上或向下调整适当的量。 要调整对比度,您基本上可以调整特定值与中心值之间的差异。 您通常希望以非线性方式执行此操作,因此范围中间附近的值会进行相当多的调整,但接近末端或范围的值几乎不会受到太大影响(以及任何位于最中间的值)结束,根本没有改变)。

完成后,您可以转换回 RGB,然后再转换回普通格式,例如 JPEG。

图像亮度在这里- 使用 RGB 值的平均值并移动它们。

在这里也可以使用其他语言解决方案进行对比。


编辑以防上述链接失效:

下面 Jerry Coffin 给出的答案涵盖了相同的主题,并且链接仍然有效。

但是,要调整亮度,您需要为图像的 R、G、B 字段的每个字段添加一个常量值。 确保使用饱和数学 - 不允许值低于 0 或高于位深度允许的最大值(24 位颜色为 8 位)

RGB_struct color = GetPixelColor(x, y);
size_t newRed   = truncate(color.red   + brightAdjust);
size_t newGreen = truncate(color.green + brightAdjust);
size_t newBlue  = truncate(color.blue  + brightAdjust);

相比之下,我从这个网站上获取并稍微修改了代码:

float factor = (259.0 * (contrast + 255.0)) / (255.0 * (259.0 - contrast));
RGB_struct color = GetPixelColor(x, y);
size_t newRed   = truncate((size_t)(factor * (color.red   - 128) + 128));
size_t newGreen = truncate((size_t)(factor * (color.green - 128) + 128));
size_t newBlue  = truncate((size_t)(factor * (color.blue  - 128) + 128));

其中truncate(int value)确保 8 位颜色的值保持在 0 到 255 之间。 请注意,许多 CPU 具有在单个周期内完成此操作的内在功能。

size_t truncate(size_t value)
{
    if(value < 0) return 0;
    if(value > 255) return 255;

    return value;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM