Bueno, una primera aproximacion seria la siguiente:
Código Delphi
[-]
type
TRGB = array[1..3]of Byte;
procedure Ampliar(Imagen: TPicture; Z: Integer);
var
Bitmap: TBitmap;
P1, P2, P3, P4: ^TRGB;
i, j, k: Integer;
x: Integer;
begin
if Z < 1 then
Exit;
Bitmap:= TBitmap.Create;
try
Bitmap.Width:= Imagen.Width;
Bitmap.Height:= Imagen.Height;
Bitmap.Canvas.Draw(0,0,Imagen.Graphic);
Bitmap.PixelFormat:= pf24bit;
Imagen.Assign(Bitmap);
Imagen.Bitmap.Width:= Bitmap.Width * Z;
Imagen.Bitmap.Height:= Bitmap.Height * Z;
for j:= 0 to Imagen.Bitmap.Height - 1 do
begin
P1:= Bitmap.ScanLine[j div Z];
P2:= Imagen.Bitmap.ScanLine[j];
if j >= Z then
P3:= Bitmap.ScanLine[(j div Z)-1]
else
P3:= P1;
P4:= P1;
for i:= 0 to Bitmap.Width - 1 do
begin
for x:= 1 to Z do
begin
for k:= 1 to 3 do
begin
P2^[k]:= P4^[k] + (((P1^[k] - P4^[k]) * x) div Z);
P2^[k]:= P2^[k] + (((P3^[k] - P2^[k]) * (z-(j mod Z))) div Z);
end;
inc(P2);
end;
P4:= P1;
inc(P1);
inc(P3);
end;
end;
finally
Bitmap.Free;
end;
end;
Ampliar(Image1.Picture,3);
Image1.Refresh;
Puede que tenga fallos, es solo una primera aproximación, además tiene que haber una solución mejor donde el Zoon no tenga que ser un numero entero. Todo se andará ...