Hola Nacho!
Recibí tu correo en donde me pides que te explique como puedes modificar la escala de tonos sepia que puse como ejemplo en el código.
Voy a publicar el código que utilicé para crearla, por si le interesa a alguien más.
Con esta función puedes llenar un arreglo con un gradiente de colores.
Código Delphi
[-]
type
TEscala= array[0..255] of TColor;
function TForm1.CrearGradiente(Colors: array of TColor):TEscala;
type
RGBArray = array[0..2] of Byte;
var
x, y, z, mx, bis, faColorsh: Integer;
Factor: double;
A: RGBArray;
B: array of RGBArray;
Escala: TEscala;
I:Integer;
begin
mx := High(Colors);
if (mx <1) or ( mx>2) then
raise Exception.Create('El número de colores debe estar entre 2..3');
SetLength(b, mx + 1);
for x := 0 to mx do
begin
Colors[x] := ColorToRGB(Colors[x]);
b[x][0] := GetRValue(Colors[x]);
b[x][1] := GetGValue(Colors[x]);
b[x][2] := GetBValue(Colors[x]);
end;
faColorsh := Round(255 / mx);
I:=0;
for y := 0 to mx - 1 do
begin
if y = mx - 1 then
bis := 255 - y * faColorsh - 1
else
bis := faColorsh;
for x := 0 to bis do
begin
Factor := x / bis;
for z := 0 to 3 do
a[z] := Trunc(b[y][z] + ((b[y + 1][z] - b[y][z]) * Factor));
Escala[i]:= RGB(a[0], a[1], a[2]);
Inc(I);
end;
end;
b := nil;
Result:=Escala;
end;
Con esta función lo puedes enviar a un archivo de texto para después incluirla en el código.
Código Delphi
[-]
procedure TForm1.GuardarEnTxt(Escala:TEscala;FileName: String);
var
I: Integer;
S: String;
Stream:TFileStream;
begin
Stream:=TFileStream.Create(FileName,fmCreate);
S:='const'+#13+'TTonos: array[0..255] of TColor=('+#13;
Stream.Write(PChar(S)^,Length(S));
S:=' ';
for I:=0 to 255 do
begin
S:=S+'$'+IntToHex(Escala[i],6);
if I=255 then
begin
S:=S+');';
Stream.Write(PChar(S)^,Length(S));
end
else
begin
S:=S+',';
if (I mod 8)=7 then
begin
S:=S+#13;
Stream.Write(PChar(S)^,Length(S));
S:=' ';
end;
end;
end;
Stream.Free;
end;
Un ejemplo de como puedes llamar la función.
Código Delphi
[-]
procedure TForm1.Button1Click(Sender: TObject);
var
Escala:TEscala;
begin
Escala:=CrearGradiente([clBlack, clRed, clWhite]);
GuardarEnTxt(Escala,'c:\escala.txt');
end;
Con este ejemplo creas una escala de tonos que comienza en NEGRO, pasando por ROJO y que termina en BLANCO.
Puedes experimentar con otros colores para obtener mejores efectos.
Un saludo.