 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
vizca321 Lt


Registrado: 06 May 2008Mensajes: 83Ubicación: Mexico
|
Publicado: Vie 14 Abr, 2017 4:19 am Asunto: Delphi Anti Aliasing BMP trasladar a Builder |
|
|
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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Sab 15 Abr, 2017 12:14 am Asunto: |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|