PDA

Ver la Versión Completa : Combinar 2 imagenes en una


seoane
14-06-2006, 13:19:15
Con estas dos funciones podemos superponer una imagen sobre otra y combinarlas. El primer metodo "Fusionar" combina los colores de una imagen con la otra, mientras el metodo "Entrelazar" entrelaza los pixeles de una imagen con los de la otra, este ultimo puede dar problemas de muaré al redimensionar la imagen.


type
Triple = array[1..3]of Byte;

function Min(i,j: Integer): Integer;
begin
if i < j then
Result:= i
else
Result:= j;
end;

procedure Convertir(Imagen: TPicture);
var
Bitmap: TBitmap;
begin
if not (Imagen.Graphic is TBitmap) then
begin
Bitmap:= TBitmap.Create;
try
Bitmap.Width:= Imagen.Width;
Bitmap.Height:= Imagen.Height;
Bitmap.Canvas.Draw(0,0,Imagen.Graphic);
Imagen.Assign(Bitmap);
finally
Bitmap.Free;
end;
end;
Imagen.Bitmap.PixelFormat:= pf24bit;
end;

procedure Fusionar(Imagen1, Imagen2: TPicture; Transparente: Boolean);
var
P1, P2: ^Triple;
i, j: Integer;
begin
Convertir(Imagen1);
Convertir(Imagen2);
for j:= 0 to Min(Imagen1.Bitmap.Height,Imagen2.Bitmap.Height) - 1 do
begin
P1:= Imagen1.Bitmap.ScanLine[j];
P2:= Imagen2.Bitmap.ScanLine[j];
for i:= 0 to Min(Imagen1.Bitmap.Width,Imagen2.Bitmap.Width) - 1 do
begin
if not (Transparente and (P2[1]=$FF) and (P2[1]=$FF) and (P2[1]=$FF)) then
begin
P1^[1]:= (P1^[1] + P2^[1]) shr 1;
P1^[2]:= (P1^[2] + P2^[2]) shr 1;
P1^[3]:= (P1^[3] + P2^[3]) shr 1;
end;
inc(P1); inc(P2);
end;
end;
end;

procedure Entrelazar(Imagen1, Imagen2: TPicture; Transparente: Boolean);
var
P1, P2: ^Triple;
i, j: Integer;
begin
Convertir(Imagen1);
Convertir(Imagen2);
for j:= 0 to Min(Imagen1.Bitmap.Height,Imagen2.Bitmap.Height) - 1 do
begin
P1:= Imagen1.Bitmap.ScanLine[j];
P2:= Imagen2.Bitmap.ScanLine[j];
for i:= 0 to Min(Imagen1.Bitmap.Width,Imagen2.Bitmap.Width) - 1 do
begin
if not (Transparente and (P2[1]=$FF) and (P2[1]=$FF) and (P2[1]=$FF)) then
if Odd(i+j) then
begin
P1^[1]:= P2^[1];
P1^[2]:= P2^[2];
P1^[3]:= P2^[3];
end;
inc(P1); inc(P2);
end;
end;
end;


Las imagenes originales pueden ser cualquier tipo soportado por un TPicture (Bmp, jpeg, ico, wmf) pero el resultado siempre es un Bitmap, asi que habra que tenerlo en cuenta. La opcion Transparente indica que las zonas de la segunda imagen de color blanco (o si es un icono, la parte trasnparente) no se combinaran con la primera imagen.

Ahora unos ejemplitos de como usarlas:

En un formulario con dos TImage fusionamos el primero con el segundo y mostramos el resultado en el primer TImage

Fusionar(Image1.Picture,Image2.Picture,FALSE);
Image1.Repaint;


Este es un poco mas complicado, abrimos un icono que tenemos guardado en un archivo, y lo combinamos utilizando el tramado, y con la opcion Tranparente, en la posicion 100,100. Haber si se entiende:

var
Imagen: TPicture;
Icono: TIcon;
begin
Imagen:= TPicture.Create;
Icono:= TIcon.Create;
try
Icono.LoadFromFile('d:\1.ico');
Imagen.Bitmap.Width:= Image1.Picture.Width;
Imagen.Bitmap.Height:= Image1.Picture.Height;
Imagen.Bitmap.Canvas.Draw(100,100,Icono);
Fusionar(Image1.Picture,Imagen,TRUE);
finally
Imagen.Free;
Icono.Free;
end;
Image1.Repaint;
end;