当前位置:C++技术网 > 精选软件 > 通过Gamma校正调整屏幕的亮度

通过Gamma校正调整屏幕的亮度

更新时间:2016-06-24 21:42:55浏览次数:1+次

    Windows系统似乎没有直接的API供我们在程序中调整屏幕的亮度对比度之类的, 不过通过查阅资料发现可以通过调整Gamma校正来实现调整屏幕的亮度。

    其实也就是一个API的事情,即SetDeviceGammaRamp。函数声明如下:


BOOL WINAPI SetDeviceGammaRamp( HDC hDC,  LPVOID lpRamp);


    SetDeviceGammaRamp函数只有两个参数,一个是DC句柄,如果我们要设置屏幕的亮度就获取屏幕DC,然后传进去即可。而第二个参数就是一个缓冲地址,我们可以传入一个数组地址即可。数组的元素类型为WORD类型,长度为256x3个元素。因为Gamma校正是分三个维度的矫正,简单理解就是有三个因素影响,所以有三组数据,每一组256个WORD值,只是全部放在一个WORD数组中。SetDeviceGammaRamp函数会处理好这个数据的。

    Gamma校正值如果等于1,保持原样。如果大于1,就变亮,值越大越亮。如果小于1,则变暗,越小越暗。我们理解到这里就够用了。如果想了解更多,请搜索“Gamma校正”深入学习Gamma校正的知识。

    为了简化代码的使用,我将调整屏幕亮度的代码封装起来了,代码如下:


void SetLight(int rate)
{
    WORD ramp[256*3];
    for(int i = 0; i < 256; i++)
    {
        ramp[i] = ramp[i+256] = ramp[i+512] = (WORD)min(65535, max(0, pow(((double)(i+1) / 256.0), (double)(40.0-rate)/10.0) * 65535 + 0.5));
    }
    SetDeviceGammaRamp(::GetDC(NULL), ramp);//设置Gamma校正
}
 代码说明:


1.rate表示亮度比例,取值0-39,0表示最暗,39表示最亮。

2.调整的亮度直接生效。

    如果要在程序退出时恢复原来的Gamma校正值,可以先读取系统的值,然后退出时设置回去。代码如下:

WORD m_RampSaved[256*3]; 
GetDeviceGammaRamp(::GetDC(NULL), m_RampSaved);

    下面是调整的效果图:


【未设置时的效果】

【未设置时的效果】



【设置亮度很暗的效果】

【设置亮度很暗的效果】

【设置亮度很亮的效果】

【设置亮度很亮的效果】

    你可以利用这个函数,使用滑动条来做,让调节更加方便。