Delphi - Establecer luminosidad de un color

 
Vista:

Establecer luminosidad de un color

Publicado por Irreal (69 intervenciones) el 21/12/2006 10:58:24
Hola!

¿Como se puede cambiar la luminosidad de un color?.

En principio parece ser que mediante alguna función matematica se establece cambiando los valores RGB, aunque no consigo establecer la proporción.

Por ello mi pregunta es si existe alguna propiedad que cambie el valor luminosidad o si alguién posee el algoritmo que devuelve los valores RGB de un color en función del valor luminosidad.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Establecer luminosidad de un color

Publicado por BigLuis (713 intervenciones) el 21/12/2006 12:42:37
A ver si te sirve esto:
Tienes que declarar estos tipos para poder usar el procedimiento ScanLine
type
TRGBArray = ARRAY[word] OF TRGBTriple;
pRGBArray = ^TRGBArray;

implementation

{$R *.DFM}

Y despues puedes utilizar este procedimiento en el que yo he usado la propiedad Picture de un componente TImage

procedure CambiaBrillo(OrigPicture, DestPicture: TPicture; percent: integer);
var i, j: integer;
OrigRow, DestRow: pRGBArray;
Red, Green, Blue: integer;
begin
// Un aunmento del 100% de la variable percent hará la imagen totalmente blanca
// Una disminución del -100% hará la imagen totalmente negra

// El porcentaje es relativo a 255
percent := (percent * 255) div 100;

// para cada fila de pixels
for i := 0 to OrigPicture.Height - 1 do
begin
OrigRow := OrigPicture.Bitmap.ScanLine[i];
DestRow := DestPicture.Bitmap.ScanLine[i];

// para cada pixel en la fila
for j := 0 to OrigPicture.Width - 1 do
begin
// Consigo los valores de color del pixel
Red := OrigRow[j].rgbtRed;
Blue := OrigRow[j].rgbtBlue;
Green := OrigRow[j].rgbtGreen;

// Sumo el procentaje a cada valor
// El resultado puede llegar a ser mayor que 255 o menor que 0
Red := Red + percent;
Green := Green + percent;
Blue := Blue + percent;

// Corrijo los valores excesivamente altos o bajos
Red := Max(0, Min(255, Red));
Green := Max(0, Min(255, Green));
Blue := Max(0, Min(255, Blue));

// Asigno los valores calculados al pixel
DestRow[j].rgbtRed := Red;
DestRow[j].rgbtGreen := Green;
DestRow[j].rgbtBlue := Blue;
end;
end;
end;

Y la invoco asi

procedure TFormBrillo.TrackBarChange(Sender: TObject);
var
percent: integer;
begin
percent := TTrackBar(Sender).Position;

if percent <= 0 then PercentLbl.Caption := Format('%d %%', [percent])
else PercentLbl.Caption := Format('+%d %%', [percent]);
PercentLbl.Refresh;

CambiaBrillo(OrigImage.Picture, DestImage.Picture, percent);

DestImage.Repaint;
end;

Suerte y feliz Navidad.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar