seoane
22-02-2007, 02:12:14
Últimamente he puesto por aquí un poco de código sobre como aplicar filtros sobre una imagen: convertir a gris, cambiar tono, suavizar, detectar bordes, etc ... Así que he decidido hacer una recopilación y meterlo todo en una misma librería. Nada pretencioso, para esto ya hay unas librerías muy buenas que seguro que tienen muchos mas filtros, y sobre todo, funcionan mas rápido. Pero también es verdad que a veces no necesitamos demasiado y tener un pequeño código a mano puede ayudarnos.
La librería tiene la siguiente estructura. Para empezar se define el tipo "TImagen" con el que trabajan todos los filtros, y que nos permite que el resto del código sea independiente del formato gráfico con el que estemos trabajando, e incluso del sistema operativo, recordemos que el TBitmap utiliza bastantes funciones de la API de windows (1).
Cada filtro, es un objeto descendiente de la clase TFilto y todos tienen el mismo método "Aplicar". Esto lo hice así pensando la posibilidad de crear arrays de filtros y poderlos aplicarlos en serie sobre una misma imagen, pero eso lo dejaremos para mas adelante.
Un ejemplo básico de como aplicar un filtro seria el siguiente:
Imagen:= TImagen.Create;
try
// Bitmap es un objeto de tipo TBitmap
Imagen.LoadFromBitmap(Bitmap);
with TFiltroSuavizar.Create do
try
Aplicar(Imagen);
finally
Free;
end;
Imagen.SaveToBitmap(Bitmap);
finally
Imagen.Free;
end;
Un ejemplo un poco mas extenso, seria este otro:
var
Imagen: TImagen;
Bitmap: TBitmap;
begin
Imagen:= TImagen.Create;
with Imagen do
try
Bitmap:= TBitmap.Create;
try
Bitmap.LoadFromFile('C:\Dibujo.bmp');
// Por ahora solo admite imagenes de 24 bits
Bitmap.PixelFormat:= pf24bit;
LoadFromBitmap(Bitmap);
// Primero suavizamos la imagen
with TFiltroSuavizar.Create do
try
Aplicar(Imagen);
finally
Free;
end;
// Y luego detectamos los bordes de la imagen
with TFiltroSobel.Create(16) do
try
Aplicar(Imagen);
finally
Free;
end;
SaveToBitmap(Bitmap);
Bitmap.SaveToFile('C:\Dibujo2.bmp');
finally
Bitmap.Free;
end;
finally
Imagen.Free;
end;
end;
Bueno, aquí os dejo la unit. Recordar que es un primer esbozo, y si alguien se anima a crear algún filtro nuevo, o algún otro cambio en la estructura de la unit, que lo diga.
(1) He estado haciendo algunas pruebas con freepascal en linux y debo ser un poco torpe, pero no he podido encontrar el objeto TBitmap o algún equivalente. Creo que en las librerías que instala lazarus se puede encontrar, pero me preguntaba si no se podría encontrar algo parecido en las librerías que trae freepascal por defecto. :confused:
La librería tiene la siguiente estructura. Para empezar se define el tipo "TImagen" con el que trabajan todos los filtros, y que nos permite que el resto del código sea independiente del formato gráfico con el que estemos trabajando, e incluso del sistema operativo, recordemos que el TBitmap utiliza bastantes funciones de la API de windows (1).
Cada filtro, es un objeto descendiente de la clase TFilto y todos tienen el mismo método "Aplicar". Esto lo hice así pensando la posibilidad de crear arrays de filtros y poderlos aplicarlos en serie sobre una misma imagen, pero eso lo dejaremos para mas adelante.
Un ejemplo básico de como aplicar un filtro seria el siguiente:
Imagen:= TImagen.Create;
try
// Bitmap es un objeto de tipo TBitmap
Imagen.LoadFromBitmap(Bitmap);
with TFiltroSuavizar.Create do
try
Aplicar(Imagen);
finally
Free;
end;
Imagen.SaveToBitmap(Bitmap);
finally
Imagen.Free;
end;
Un ejemplo un poco mas extenso, seria este otro:
var
Imagen: TImagen;
Bitmap: TBitmap;
begin
Imagen:= TImagen.Create;
with Imagen do
try
Bitmap:= TBitmap.Create;
try
Bitmap.LoadFromFile('C:\Dibujo.bmp');
// Por ahora solo admite imagenes de 24 bits
Bitmap.PixelFormat:= pf24bit;
LoadFromBitmap(Bitmap);
// Primero suavizamos la imagen
with TFiltroSuavizar.Create do
try
Aplicar(Imagen);
finally
Free;
end;
// Y luego detectamos los bordes de la imagen
with TFiltroSobel.Create(16) do
try
Aplicar(Imagen);
finally
Free;
end;
SaveToBitmap(Bitmap);
Bitmap.SaveToFile('C:\Dibujo2.bmp');
finally
Bitmap.Free;
end;
finally
Imagen.Free;
end;
end;
Bueno, aquí os dejo la unit. Recordar que es un primer esbozo, y si alguien se anima a crear algún filtro nuevo, o algún otro cambio en la estructura de la unit, que lo diga.
(1) He estado haciendo algunas pruebas con freepascal en linux y debo ser un poco torpe, pero no he podido encontrar el objeto TBitmap o algún equivalente. Creo que en las librerías que instala lazarus se puede encontrar, pero me preguntaba si no se podría encontrar algo parecido en las librerías que trae freepascal por defecto. :confused: