Ver Mensaje Individual
  #9  
Antiguo 26-01-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Reputación: 24
seoane Va por buen camino
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
      // Actuales
      P1:= Bitmap.ScanLine[j div Z];
      P2:= Imagen.Bitmap.ScanLine[j];
      // Anteriores
      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;

// Por ejemplo, Zoom x3 
  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á ...

Última edición por seoane fecha: 26-01-2007 a las 17:54:22.
Responder Con Cita