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

Simulación del movimiento de los electrones en un campo electrico

Espectacular simulación realizada con OpenGL del movimiento de los electrones cuando atraviesan un campo eléctrico. Como muestra la image...