La Web del Programador: Comunidad de Programadores
 
    Pregunta:  7672 - COMO LLEVO LAS IMAGES DE COLORES A ESCALA GRIS
Autor:  Anibal Guerra Cuellar
Necesito este dato y otros mas para realizar un sofware de caracter educativo y cientifico, me seria de gran ayuda su respuesta

  Respuesta:  Israel Renato Macip Millán
Pues la espuesta aunque se ve complicada es muy sencilla, recordarás que las imagenes a color estan formadas por una triada de colores primarios comunmente conocida como RGB (Red Green Blue), pues estos colores estan dentro de la paleta basica de 0 a 255, lo que hay que hacer es llevar a cada parte del RGB a un corrimiento para que surta el efecto, a continuación te escribo el código para dicha funcion.

Cabe mencionar tambien que existen varios metodos, de acuerdo a la velocidad de trabajo, ya que unos trabajan la imagen como matriz, (punto por punto), o vectores (por líneas) o por placas (matrices).

El siguiente metodo esta aplicado al punto

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
ImagenAbierta: boolean;
pixf : integer;
Ncol, Nren : integer;
bm:TBitMap;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
let, nom : string;
s : string;
begin
if (OPD.Execute) then
begin
nom := OPD.FileName;
bm.LoadFromFile(nom);
Image1.Picture.Bitmap.Assign(bm);
ImagenAbierta := true;
GroupBox1.Caption:= nom;
Button2.Enabled := true;
Ncol := Image1.Width;
Nren := Image1.Height;
let := '';
str (Ncol,s);
let := let + s +' x ';
str (Nren,s);
let := let + s;
Resol.Text := let;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
c, r, g, b, x : integer;
i, j : integer;
begin
if imagenAbierta then
begin
//pasar a grises
screen.cursor := crHourGlass;
for i := 0 to Ncol - 1 do
for j := 0 to Nren -1 do
begin
c := Image1.Canvas.Pixels[i,j];
r := c and $ff;
g := (c and $ff00) shr 8;
b := (c and $ff0000) shr 16;
x := (r+g+b) div 3;
c := $02000000 or x; //modo de paleta rojo
c := c or (x shl 8); //verde
c := c or (x shl 16); //azul
Image1.Canvas.Pixels[i,j] := c;
end;
screen.cursor := crArrow;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
BM := TBitMap.Create;
ImagenAbierta := false;
Button2.Enabled := false;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
close;
end;

Si requieres mas datos comunicate conmigo.

Espero te sirva