使用c ++调整图像亮度/对比度,而不使用任何其他第三方库或依赖
答案 0 :(得分:4)
使用库读取图像,就像Independent JPEG library一样。当您有原始数据时,您可以convert it从RGB到HSL或(最好)CIE L a b *。对比度和亮度基本上只涉及调整L通道 - 调整亮度,只需将所有L值向上或向下调整适当的量。要调整对比度,您基本上可以调整特定值和中心值之间的差异。您通常希望非线性地执行此操作,因此接近范围中间的值会进行相当大的调整,但接近结束或范围的值几乎不会受到影响(并且任何情况都会受到影响)结束,根本没有改变。)
完成后,您可以转换回RGB,然后返回普通格式,如JPEG。
答案 1 :(得分:3)
图像亮度 here (死链接) - 使用RGB值的平均值并移动它们。
对比度 here (死链接)以及其他语言解决方案。
编辑链接已死:
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);
相比之下,我已经从this website采取并略微修改了代码:
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;
}