Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Delphi Anti Aliasing BMP trasladar a Builder

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Delphi Anti Aliasing BMP trasladar a Builder Responder citando

Hola bn día, necesito trasladar este codigo a C++Builder el codigo es para optimisar BMP a la hora de redimencionarlo
Código:

type
  TRGBTripleArray = array[0..32767] of TRGBTriple;
  PRGBTripleArray = ^TRGBTripleArray;
...
// Esta cambia el alto y ancho, estirando la imagen si es necesario
procedure Redimensionar(Imagen:TBitmap; Ancho, Alto: Integer);
var
  Bitmap: TBitmap;
  //····························································
  // Procedimiento de Antialiasing con Distancia=1
  procedure 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;
  //···························································· 
begin
 
  Bitmap:= TBitmap.Create;
 
  // Aplicamos antialiasing
  Antialiasing(Imagen, Bitmap);
  Imagen.Assign(Bitmap);
 
  // reducir
  try
    Bitmap.Width:= Ancho;
    Bitmap.Height:= Alto;
    Bitmap.Canvas.StretchDraw(Bitmap.Canvas.ClipRect, Imagen);
    Imagen.Assign(Bitmap);
  finally
    Bitmap.Free;
  end;
end;

_________________
[code:1]//----------------Att Gabriel----------------
void Gracias(){
if (Respuesta == true){
Showmessage("Muchisimas Gracias!")
else
Showmessage("Ojala te sirva... ^_^ ");
}[/code:1]
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Antes de nada decir que el código original es de Neftalí y se encuentra publicado aquí: Redimensionar una imagen (Antialiasing)

Código:

#include <Math.h>
#define Round(a) floor((a)+0.5);

// Procedimiento de Antialiasing con Distancia=1
void Antialiasing(Graphics::TBitmap* bmp1, Graphics::TBitmap* bmp2)
{
  int R1, G1, B1, Y, X, j;
  RGBTRIPLE *SL1, *SL2, *SL3;

  // Tamaño del bitmap destino
  bmp2->Height = bmp1->Height;
  bmp2->Width = bmp1->Width;

  // SCANLINE
  SL1 = (RGBTRIPLE*)bmp1->ScanLine[0];
  SL2 = (RGBTRIPLE*)bmp1->ScanLine[1];
  SL3 = (RGBTRIPLE*)bmp1->ScanLine[2];

  // reorrido para todos los pixels
  for(Y = 1; Y <= bmp1->Height - 2; Y++){
    for(X = 1; X <= bmp1->Width - 2; X++){
      R1 = 0;  G1 = 0; B1 = 0;
      // los 9 pixels a tener en cuenta
      for(j = -1; j<=1; j++){
        // 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;
      }
      // Nuevo color
      R1 = Round(R1/9);
      G1 = Round(G1/9);
      B1 = Round(B1/9);
      // Asignar el nuevo
      bmp2->Canvas->Pixels[X][Y] = RGB(R1,G1,B1);
    }
    // Siguientes...
    SL1 = SL2;
    SL2 = SL3;
    SL3 = (RGBTRIPLE*)bmp1->ScanLine[Y+1];
  }
}

// Esta cambia el alto y ancho, estirando la imagen si es necesario
void Redimensionar(Graphics::TBitmap* Imagen, int Ancho, int Alto)
{
  Graphics::TBitmap *Bitmap = new Graphics::TBitmap;
 
  // Aplicamos antialiasing
  Antialiasing(Imagen, Bitmap);
  Imagen->Assign(Bitmap);
 
  // reducir
  try{
    Bitmap->Width = Ancho;
    Bitmap->Height = Alto;
    Bitmap->Canvas->StretchDraw(Bitmap->Canvas->ClipRect, Imagen);
    Imagen->Assign(Bitmap);
  }__finally{
    delete Bitmap;
  }
}


Añadir que GDI+ ofrece mayor calidad a la hora de redimensionar imágenes que GDI. Puedes tener un ejemplo aquí: Redimensionar una imagen con GDI+ flat API. El código lo encontrarás en Delphi y en C/C++ Builder.

Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.