调整显示伽玛值

时间:2011-08-27 07:30:05

标签: delphi

我正在考虑修改我的显示器的亮度/对比度/灰度系数我找到了一个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;

如果你指出我正确的方向,我将不胜感激。感谢。

最后一个错误说明:参数不正确

1 个答案:

答案 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,我可以在我的嫂子的笔记本电脑上测试它,并且它也有效。