Ver Mensaje Individual
  #8  
Antiguo 16-02-2005
Avatar de Héctor Randolph
[Héctor Randolph] Héctor Randolph is offline
Miembro Premium
 
Registrado: dic 2004
Posts: 882
Reputación: 22
Héctor Randolph Va por buen camino
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;
//Crea un gradiente entre tres colores fijos
//La función está limitada a tres colores pero puede adaptarse para cuatro o más
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 [-]
//  Guarda la escala en un archivo de texto

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
  //Crea una escala de tonos en ROJO
  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.
Responder Con Cita