我正在考虑修改我的显示器的亮度/对比度/灰度系数我找到了一个api,其目的我认为是这样但我没有成功实现它...这里是代码
var
i,j:Integer;
buf:array [0..2,0..255] of Word;
wBright:Word;
myDC:HDC;
begin
myDC:=GetDc(GetDesktopWindow);
GetDeviceGammaRamp(mydc,buf);
for i:=0 to 2 do
for j:=0 to 255 do
begin
buf[i][j]:=buf[i][j] + 100; //if i don't modify the values the api works
end;
SetDeviceGammaRamp(mydc,buf);
end;
如果你指出我正确的方向,我将不胜感激。感谢。
最后一个错误说明:参数不正确
答案 0 :(得分:1)
数组中的值必须确实是斜坡,即它们将可能的R,G和B值映射到亮度值。这样你也可以创建有趣的效果,但不能使用下面的例程。在网上找到类似的东西:
uses Windows;
// SetDisplayBrightness
//
// Changes the brightness of the entire screen.
// This function may not work properly in some video cards.
//
// The Brightness parameter has the following meaning:
//
// 128 = normal brightness
// above 128 = brighter
// below 128 = darker
function SetDisplayBrightness(Brightness: Byte): Boolean;
var
GammaDC: HDC;
GammaArray: array[0..2, 0..255] of Word;
I, Value: Integer;
begin
Result := False;
GammaDC := GetDC(0);
if GammaDC <> 0 then
begin
for I := 0 to 255 do
begin
Value := I * (Brightness + 128);
if Value > 65535 then
Value := 65535;
GammaArray[0, I] := Value; // R value of I is mapped to brightness of Value
GammaArray[1, I] := Value; // G value of I is mapped to brightness of Value
GammaArray[2, I] := Value; // B value of I is mapped to brightness of Value
end;
// Note: BOOL will be converted to Boolean here.
Result := SetDeviceGammaRamp(GammaDC, GammaArray);
ReleaseDC(0, GammaDC);
end;
end;
不幸的是,在Mac上Parallels的Win7 VM中,我无法测试他的,但它应该适用于大多数普通的Windows PC。
FWIW,我在Win7 VM中运行它,例程返回True
。如果我使用其他值,例如
Value := 127 * I;
例程返回False
和
ShowMessage(SysErrorMessage(GetLastError));
显示
参数不正确
将此更改为:
Value := 128 * I;
再次返回True
。我假设值必须形成某种斜率(或斜坡)。此例程创建线性斜坡。我想你也可以使用其他种类,例如一个sigmoid,以达到其他效果,如更高的对比度。
当然,我不能看到VM中亮度的任何差异,对不起。
更新:但它似乎适用于David Heffernan,我可以在我的嫂子的笔记本电脑上测试它,并且它也有效。