Ver Mensaje Individual
  #1 (permalink)  
Antiguo 02/04/2010, 19:38
auxsys
 
Fecha de Ingreso: mayo-2008
Mensajes: 42
Antigüedad: 16 años
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