Foros del Web » Programación para mayores de 30 ;) » .NET »

Mejorar eficiencia de funciones gráficas

Estas en el tema de Mejorar eficiencia de funciones gráficas en el foro de .NET en Foros del Web. Buenas! Estoy trabajando con VB.NET en un programa que realiza muchísimas operaciones gráficas en imágenes. El resultado podría ser una imagen final en la que ...
  #1 (permalink)  
Antiguo 02/04/2010, 19:38
 
Fecha de Ingreso: mayo-2008
Mensajes: 42
Antigüedad: 16 años, 7 meses
Puntos: 0
Mejorar eficiencia de funciones gráficas

Buenas! Estoy trabajando con VB.NET en un programa que realiza muchísimas operaciones gráficas en imágenes. El resultado podría ser una imagen final en la que se han dibujado cientos y cientos de otras imágenes, situadas en lugares diferentes, escaladas, rotadas, con el brillo, la saturación y el matiz de color modificados, con mapas de opacidad aplicados para obtener canales alpha... En fín, me llevaría bastante tiempo explicar lo que hace el programa (y otro tanto para explicar su utilidad), pero en resumen, hay que efectuar muchísimas operaciones.

El programa lo tengo bastante avanzado y he implementado todas estas operaciones, ya que no quiero utilizar librerías de terceros, y algunas de las funciones que utilizo son bastante raras, imagino. El resultado es bueno, pero puede llevar unos cuantos segundos el generar la imagen final.

El problema es que mis funciones trabajan a nivel de píxel... es decir, modifico los valores de cada píxel individualmente, y claro, para imágenes grandes...
Sin embargo está claro que existen soluciones muchísimo más eficientes (por ejemplo, las operaciones gráficas que realiza el objeto Graphics en .NET).

En definitiva, me gustaría conocer la forma de hacer mis funciones gráficas más eficientes. Alguien puede echarme una mano?
Muchísimas gracias.

PD: Aquí pongo un ejemplo de una función sencillita para aplicar un mapa de opacidad a una imagen. Lo que cuenta es la idea y el procedimiento, no la función en sí.

Código VB:
Ver original
  1. ''' <summary>
  2.    ''' Aplica un mapa de opacidad a una imagen y la devuelve con
  3.    ''' el canal alpha correspondiente a este mapa de opacidad
  4.    ''' </summary>
  5.    Public Function ApplyOpacityMap(ByVal DiffuseImage As Image, _
  6.                                 ByVal OpacityImage As Image) As Image
  7.  
  8.         Dim imgDiffuse As Bitmap = DiffuseImage.Clone
  9.         Dim imgOpacity As Bitmap = OpacityImage.Clone
  10.         Dim imgResult As New Bitmap(imgDiffuse.Width, imgDiffuse.Height)
  11.         Dim NuevoColor As Color
  12.  
  13.         Dim PixelColor As Color
  14.         Dim AlphaValue As Integer
  15.  
  16.         For Y = 0 To imgDiffuse.Height - 1
  17.             For X = 0 To imgDiffuse.Width - 1
  18.  
  19.                 'Se extrae el valor Alpha que tendrá el píxel a partir del mapa de opacidad
  20.                PixelColor = imgOpacity.GetPixel(X, Y)
  21.                 AlphaValue = PixelColor.GetBrightness * 255
  22.  
  23.                 'Se estrae el píxel del mapa difuso
  24.                PixelColor = imgDiffuse.GetPixel(X, Y)
  25.  
  26.                 NuevoColor = Color.FromArgb(AlphaValue, PixelColor.R, PixelColor.G, PixelColor.B)
  27.                 imgResult.SetPixel(X, Y, NuevoColor)
  28.  
  29.             Next
  30.  
  31.             Application.DoEvents()
  32.  
  33.         Next
  34.  
  35.         Return imgResult
  36.  
  37.     End Function

Saludos!!!

Última edición por auxsys; 02/04/2010 a las 21:11

Etiquetas: eficiencia, funciones, gráficos, mejoras
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:47.