Modificar brillo de la pantalla

En muchas ocasiones me he visto en la necesidad de cambiar la luminosidad del monitor, pero para ello tenía que ir a un menú de la pantalla y luego a otro y de allí a otro hasta que encontré las siguientes funciones que me evitan todo esto:


SetDeviceGammaRamp  // GetDeviceGammaRamp

Lo que hace es seleccionar la "curva gamma" de la tarjeta gráfica.
Según Wikipedia:
La correccion gammano-linearidad gammacodificacion gamma, o simplemente gamma, es como se denomina cierta operacion no-lineal que se usa para codificar y decodificar luminancia o valores triestimulos en sistemas de video o imagen.La correccion gamma es, en su forma mas sencilla, definida por la siguiente ley de potencias:
V_{\text{out}} = A {V_{\text{in}}}^{\gamma}
donde A es una constante y las entradas y salidas son valores reales no negativos; en el caso comun de A = 1, las entradas y salidas caen tipicamente en el rango 0-1. Un valor gamma γ < 1 a veces se denomina gamma de codificacion, y el proceso de codificar con esta compresion no-lineal basada en una ley de potencias se llama compresion gamma; a la inversa un valor gamma y > 1 se llama gamma de decodificacion y la aplicacion de la ley de potencias expansiva se llama expansion gamma.

Codificación en Delphi :


type
tRamp=array[0..2, 0..255] of Word;
var
lRamp,lRamp1: tRamp;
function AjustarBrillo(Brillo: Byte): Boolean;
var
i, Delta: Integer;

DC: HDC;
begin
Result := False;
DC := GetDC(0); // obtener handle de screen
if DC <> 0 then // obtenido ?
begin
for i := 0 to 255 do
begin
Delta := i * (Brillo+128 );
if Delta > 65535 then Delta := 65535; //evitar desborde
lRamp[0, i]:= Delta; // Red
lRamp[1, i]:= Delta; // Green
lRamp[2, i]:= Delta; // Blue
end;
Result := SetDeviceGammaRamp(DC, lRamp); // ajustar gama
ReleaseDC(0, DC); // liberar DC
end;
end;


// Obtengo el brillo actual en el evento Oncreate de la aplicación

function ObtenerBrillo : tRamp;
begin
DC := GetDC(0); // obtener handle de screen
windows.GetDeviceGammaRamp(DC,lRamp1);
ReleaseDC(0, DC); // liberar DC
Result:=lRamp1;
end;

3 comentarios:

  1. Hola, lo he probado en Windows 7 y funciona sin problemas. ¿alguien puede indicarme si lo ha probado en Windows XP?

    ResponderEliminar
  2. Yo lo he probado desde Windows XP y funciona muy bien.

    ResponderEliminar
  3. Con WindowsXP y pantalla TFT funciona bien. ¡¡ Buen truco lo de SetDeviceGammaRamp !!

    ResponderEliminar