RE:Establecer luminosidad de un color
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.