PDA

Ver la Versión Completa : Filtros graficos


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:

Delphius
22-02-2007, 04:20:53
seoane... ¡estamos con ganas de poner código!:)

Si lo hiciste pensando en que leerias este mensaje. Pues, aqui me ves... como dulce a un niño.:D Admiro la dedicación que le pones a esto... eres un ejemplo a imitar (junto a otros miembros que están habitan en estos foros).

Yo le voy a dar una miradita... de seguro que algunos de los filtros que expones, lo debo haber visto:rolleyes: Y en cada tiempito que tenga libre y si veo que conozco de algun otro... y/o funciones sobre tratamiento de imagen. Voy a ir colaborando en esta unidad.

Saludos,

FENIXadr
09-06-2010, 21:49:56
Hola Seoane... estoy necesitando hacer unas sombras destras de unas imágenes y buscando algo de filtros para suavisar me encontré con esta librería que has hecho hace un tiempito ya.. de más esta decir que te felicito porque, si bien no son muchos filtros, se ve el esmero que has puesto y los grandes conocimientos que tienes.. bueno pero volviendo al tema.. lo que estoy haciendo es lo siguiente.. vos me decís si voy por buen camino o no.. en un BitMap, tengo una imagen en donde el color verde (R=0, G=255, B=0) es tomado como transparente.. por otro lado creo otro BitMap con una máscara que genero a partir del ScanLine con el que saque la parte transparente, de esta manera tengo un BitMap con la imagen y otro BitMap en donde todo lo verde es blanco y todo lo diferente a lo verde es negro, luego aplico un filtro para suavisar la mascara y ahi tengo la sombra, (obviamente que despues la mezclo con las distintas tonalidades de negro para que sea semitransparente) mi problema es este... sabes de un filtro que mas que un suavisado te haga un "borroneado" de una imagen?? necesito que la sombra conserve algo de su forma pero se difunda y se desparrame bastante.. Aplicar varias veces el suavisado no es la solución que estoy buscando... desde ya muchas gracias...