Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Funcion para AntiAliasing (https://www.clubdelphi.com/foros/showthread.php?t=70120)

ses27coves 30-09-2010 20:06:02

Funcion para AntiAliasing
 
Hola, tengo un procedimiento para evitar el aliasing de las imagenes, pero solo me funciona al cargar imagenes bmp y resulta que lo necesito solo para imagenes jpg. He intentado adaptarlo pero no se como hacerlo. Me da un error de 'scan line index out of rande' en la linea SL1 := bmp1.ScanLine[0];

Alguien puede orientarme sobre como hacerlo.

Gracias
Código Delphi [-]
procedure TForm1.Image2Click(Sender: TObject);
begin
 Antialiasing(image1.Picture.Bitmap, Image2.Picture.Bitmap);
end;

function TForm1._NewColor3(X, Y: integer; SL1, SL2,
  SL3: PRGBTripleArray): TColor;
var
  r1,g1,b1:Integer;
  r2, g2,b2:Integer;
  r3, g3,b3:Integer;
  r4, g4,b4:Integer;
  r5, g5,b5:Integer;
  r6, g6,b6:Integer;
  r7, g7,b7:Integer;
  r8, g8,b8:Integer;
  r9, g9,b9:Integer;
  i:Integer;
begin
  Result := RGB(R1,G1,B1);
end;

procedure TForm1.Antialiasing(bmp1, bmp2:TBitmap);
  var
    r1,g1,b1:Integer;
    Y, X, j:integer;
    SL1, SL2, SL3: PRGBTripleArray;
  begin

    // Tamaño del bitmap destino
    bmp2.Height := bmp1.Height;
    bmp2.Width := bmp1.Width;
    // SCANLINE
    SL1 := bmp1.ScanLine[0];
    SL2 := bmp1.ScanLine[1];
    SL3 := bmp1.ScanLine[2];

    // reorrido para todos los pixels
    for Y := 1 to (bmp1.Height - 2) do begin
      for X := 1 to (bmp1.Width - 2) do begin
        R1 := 0;  G1 := 0; B1 := 0;
        // los 9 pixels a tener en cuenta
        for j := -1 to 1 do begin
          // FIla anterior
          R1 := R1 + SL1[X+j].rgbtRed    + SL2[X+j].rgbtRed    + SL3[X+j].rgbtRed;
          G1 := G1 + SL1[X+j].rgbtGreen  + SL2[X+j].rgbtGreen  + SL3[X+j].rgbtGreen;
          B1 := B1 + SL1[X+j].rgbtBlue   + SL2[X+j].rgbtBlue   + SL3[X+j].rgbtBlue;
        end;
        // Nuevo color
        R1:=Round(R1 div 9);
        G1:=Round(G1 div 9);
        B1:=Round(B1 div 9);
        // Asignar el nuevo
        bmp2.Canvas.Pixels[X, Y] := RGB(R1,G1,B1);
      end;
      // Siguientes...
      SL1 := SL2;
      SL2 := SL3;
      SL3 := bmp1.ScanLine[Y+1];
    end;
  end;

Lord Delfos 01-10-2010 04:16:48

Eso se debe a que un TImage.Picture sólo tiene un TBitmap si contiene una imagen BMP (es decir, un bitmap;)).

Cuando la imagen es de otro tipo, el objeto bitmap no tiene nada adentro.


Lo que podrías hacer, antes de llamar a la rutina en cuestión, es convertir a bitmap. Lógicamente dejás de tener un jpg para pasar a tener un bitmap.

Código Delphi [-]
procedure TForm1.Image2Click(Sender: TObject);
var Bmp: TBitmap;
begin
  Bmp:= TBitmap.Create;
  Bmp.Assign(image1.Picture.Graphic);
  Antialiasing(Bmp, Image2.Picture.Bitmap);
  Bmp.Free;
end;

¿Se entiende?

Saludongos.

Neftali [Germán.Estévez] 01-10-2010 10:46:08

Cita:

Empezado por ses27coves (Mensaje 378020)
tengo un procedimiento para evitar el aliasing de las imagenes, pero solo me funciona al cargar imagenes bmp

Me suena ese procedimiento... :):);)

Si te es posible, promero podrías hacer la conversión a BMP (al mismo tamaño del original) y luego aplicar el algoritmo de antialiasing. Una vez acabado puedes hacer la conversión al revés.

ses27coves 01-10-2010 13:44:41

muchas gracias. Es una buena idea lo de pasar a bmp antes de aplicar antialiasing. Y ademas funciona.

Sobre el procedimiento de antialiasing aclarar que no es mio yo lo estraje de neftali.clubdelphi.com/?p=296 .Que por el nombre de la url me imagino que es de Neftali.

Pido disculpas por no haberlo mencionado, no era mi intención apoderarme del procedimiento. Ademas debo agradecer que la gente sea tan amable publicando y ayudando a gente como yo, ya que haveces me quedo encallado y no se como realizar algunas cosas, y gracias a lo que esta publicado en internet puedo proseguir y ademas aprender.

Neftali [Germán.Estévez] 01-10-2010 14:33:36

Cita:

Empezado por Neftali (Mensaje 378102)
Me suena ese procedimiento... :):);)

Cita:

Empezado por ses27coves (Mensaje 378115)
Sobre el procedimiento de antialiasing aclarar que no es mio yo lo estraje de neftali.clubdelphi.com/?p=296 .Que por el nombre de la url me imagino que es de Neftali.

Creo que sí. :D

Cita:

Empezado por ses27coves (Mensaje 378115)
Pido disculpas por no haberlo mencionado, no era mi intención apoderarme del procedimiento.

No tienes que pedir disculpas en absoluto. No era esa la intención de mi comentario. En ningun momento habías dicho que era tuyo, sino que intentabas adaptarlo, por lo que se deducía que no era tuyo.

Un saludo.


La franja horaria es GMT +2. Ahora son las 01:50:31.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi