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

7

使用C++调整图像的亮度/对比度,而不需要使用任何其他第三方库或依赖项。


也许你可以编写一个软件,提醒你使用屏幕上的按钮?不确定它是否必须用 C++ 编写。 - ereOn
作业?添加标签并展示你目前为止完成了什么。 - leonbloy
2个回答

7

图像亮度在这里 - 使用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;
}

3
对比编码与 GDI+ .NET Framework 有一些依赖关系。 - Suriyan Suresh
图像亮度在这里 - 使用RGB值的平均值并将它们移动。你链接的那篇文章明确指出,这是改变亮度最糟糕的方式之一。 - ScumCoder

4
使用类似于独立JPEG库的库读取图像。当您有原始数据时,可以将其从RGB转换为HSL或(最好是)CIE Lab*。对比度和亮度基本上只涉及调整L通道 - 要调整亮度,只需适当地将所有L值向上或向下调整即可。要调整对比度,您基本上需要调整特定值与中心值之间的差异。通常希望以非线性方式执行此操作,因此接近范围中间的值会受到相当大的调整,但接近范围末端的值几乎不会受到影响(任何位于末端的值都不会改变)。
完成后,可以将其转换回RGB,然后转换回诸如JPEG之类的普通格式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接